用Castle Windsor实现dll插件架构

4
我有一个IPlugin接口和一个IPluginFactory接口。我想做的是能够在运行时添加新的IPlugin实现(例如,将包含新实现的DLL添加到“插件”文件夹中)。
我正在使用Castle Windsor作为我的IoC容器,并使用TypedFactory工具来实现IPluginFactory接口。所以这是我的问题:
如何在windsor中在运行时注册新的IPlugin实现(我考虑像添加一个包含WindsorInstaller的dll那样,但是我不确定该如何操作)。
1个回答

6
温莎框架对插件的支持有限,而且不是主要目标。尤其值得注意的是,温莎框架没有提供任何开箱即用的机制来发现新的.dll文件已被放置到目录中。它也没有提供任何形式的插件/组件隔离(以单独的AppDomain或其他方式托管它们)。它也不能卸载插件/组件(虽然有一个container.RemoveComponent()方法,但它实际上并不起作用,并在即将推出的温莎3中已经被删除)。
如果您需要在运行时执行这些操作,则MAF和MEF的组合可能更适合您的要求。
如果您放宽安全要求(不进行隔离)并且放松运行时更改要求(只需一次,在启动时),则温莎可以支持此场景。
最好的方法是在您的插件程序集中拥有一些安装程序(IWindsorInstaller),并使用。
container.Install(FromAssembly.InDirectory(...));

发现这些程序集并运行注册插件组件的安装程序的方法。

感谢您的回答。我会检查MAF和MEF。 您觉得将发现新dll机制添加到Windsor中会很困难吗? 我正在考虑的另一个选项是创建一个具体的PluginFactory,该工厂将搜索新的Dll并将其安装到容器中,但我不确定在运行时安装东西是否“没问题”。 - dmorganb
1
大多数IoC容器(包括Windsor)都针对三个调用模式进行了优化,即http://docs.castleproject.org/Windsor.Three-Calls-Pattern.ashx,即当所有内容一次性注册时。您可能不遵循该模式,并在运行时继续向容器添加内容,但是您可能会在此过程中遇到问题,并降低应用程序的稳定性/健壮性。 - Krzysztof Kozmic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接