C# 将依赖项注入IWindsorInstaller实现

C# 将依赖项注入IWindsorInstaller实现,c#,inversion-of-control,castle-windsor,C#,Inversion Of Control,Castle Windsor,我有一个场景,我想从自定义数据存储中读取控制反转容器Castle Windsor的配置数据。此自定义数据存储具有类似于表的结构,其中列出了一组可能定制的组件,这些组件实现了系统中所需的接口 例如,应用程序需要IFoo的实现,但包含该实现的实际程序集和类型在此自定义数据存储中定义 我希望有一个IWindsorInstaller的实现,它读取数据结构并注册IFoo的正确实现者。但是,要正确访问自定义数据存储,我需要访问实现IDataConnectionProvider接口的工厂类。此类型已在容器中注

我有一个场景,我想从自定义数据存储中读取控制反转容器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    
   }
}

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

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


您还可以在容器中注册主机和服务,并让它自动连接您的默认数据连接提供程序,即不需要DependsOn。

通常,在安装过程完成之前解决任何问题都不是一个好主意

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

container.Install(
   new PluginInstaller(new DefaultDataConnectionProvider(){Host = host},
   FromAssembly.This()
);
请注意,最后一个调用将再次尝试实例化PluginInstaller,因此避免这种情况的最简单方法是将类设置为内部