通常的方法是为每个实现注册一个名称,并使用该名称解析它们。这就是我过去的做法。
要在其安装程序中注册插件:
container.Register(
Component.For<MyPlugin>.Named(MyPluginA.ID).ImplementedBy<MyPluginA>());
ID 可以是类的名称,也可以是任何唯一的字符串 ID。为了解决这个问题,您让 Windsor 为您实施一个可以接受 ID 的工厂。定义接口:
public interface IPluginFactory
{
MyPlugin CreatePluginById(String id);
}
定义一个组件选择器,它可以选择作为构造函数中的第一个参数提供的插件 ID:
public class PluginFactorySelector : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method, object[] arguments)
{
return (method.Name.EndsWith("ById") && arguments.Length >= 1 && arguments[0] is string)
? (string) arguments[0]
: base.GetComponentName(method, arguments);
}
}
最后,将其全部连接到应用程序的安装程序中...
container.Register(
Component.For<PluginFactorySelector, ITypedFactoryComponentSelector>().LifestyleSingleton(),
Component.For<IPluginFactory>().AsFactory(c => c.SelectedWith<PluginFactorySelector>()));