在IWindsorInstaller实现中注入依赖项

时间:2012-01-17 16:45:19

标签: c# inversion-of-control castle-windsor

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

例如,应用程序需要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    
   }
}

这是我做我想做的最好的方法吗?其他建议?

2 个答案:

答案 0 :(得分:0)

是的,这可能就是我的意思。由于这个原因,插件安装程序中的container参数就是正确的。

您还可以在容器中注册hostservice,并让它自动连接您的默认数据连接提供商,即不需要DependsOn

答案 1 :(得分:0)

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

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

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

请注意,最后一次调用将尝试再次实例化PluginInstaller,因此避免这种情况的最简单方法是使类内部。