我有一个场景,我想从自定义数据存储中读取控件容器(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
}
}
这是我做我想做的最好的方法吗?其他建议?
答案 0 :(得分:0)
是的,这可能就是我的意思。由于这个原因,插件安装程序中的container
参数就是正确的。
您还可以在容器中注册host
和service
,并让它自动连接您的默认数据连接提供商,即不需要DependsOn
。
答案 1 :(得分:0)
一般来说,在安装过程完成之前解决任何问题并不是一个好主意。
相反,我不会在容器中注册IDataConnectionProvider
(除非其他一些组件需要),但只是将其传递给安装程序的构造函数:
container.Install(
new PluginInstaller(new DefaultDataConnectionProvider(){Host = host},
FromAssembly.This()
);
请注意,最后一次调用将尝试再次实例化PluginInstaller
,因此避免这种情况的最简单方法是使类内部。