0

假设我使用以下代码从一个文件夹中注册了许多外部依赖项:

container.Register(Types.FromAssemblyInDirectory(new AssemblyFilter(""))
    .Where(a = >a.IsSubclassOf(typeof(MyPlugin))));

上面的代码工作正常,我可以看到MyPlugin容器中继承的所有依赖项。假设我有类MyPluginAMyPluginB从容器中继承MyPlugin,我想检索MyPluginA. 我应该怎么做?

谢谢

4

1 回答 1

1

通常的方法是为每个实现注册一个名称,并使用该名称解析它们。这就是我过去的做法。

要在其安装程序中注册插件:

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>()));
于 2013-10-28T14:17:42.883 回答