2012-01-17 164 views
1

我有一个场景,我想从自定义数据存储中读取控制容器(Castle Windsor)反转的配置数据。此自定义数据存储具有类似于表的结构,其中列出了一组(可能定制的)组件,这些组件实现了系统中所需的接口。向IWindsorInstaller实现注入依赖关系

例如,应用程序需要执行IFoo,但包含该实现的实际程序集和类型在此自定义数据存储中定义。

我想实施IWindsorInstaller读取数据结构并注册IFoo正确的实现者。但是,要正确访问我的自定义数据存储,我需要访问工厂类(实现IDataConnectionProvider接口)。这种类型的注册在容器中,但我不知道这是否是合理的做一些事情,如:

var container = new WindsorContainer(); 
container.Register(Component.For<IDataConnectionProvider>. 
       ImplementedBy<DefaultDataConnectionProvider>. 
       DependsOn(new { host, service }); 
container.Install(FromAssembly.This()); 

然后在装配类:

public class PluginInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
    var dataStoreConnection = container.Resolve<IDataConnectionProvider>(); 
    // read table, register other services  
    } 
} 

那是最好的方法来做我想要做的事情?其他建议?

回答

0

是的,这可能是我会做的。您的插件安装程序中的container参数正是出于这个原因。

您还可以注册在容器内hostservice,并有自动线了缺省数据连接提供商,即没有必要为DependsOn

0

一般来说,在安装过程完成之前解决这个问题并不是一个好主意。

相反,我不会注册在容器中的IDataConnectionProvider(除非其他一些部件需要),但只是把它传递到您的安装程序的构造函数:

container.Install(
    new PluginInstaller(new DefaultDataConnectionProvider(){Host = host}, 
    FromAssembly.This() 
); 

注意,最后一次通话将尝试再次实例化PluginInstaller ,所以避免这种情况的最简单方法就是让班级内部化。