Castle Windsor - 根据类名解析依赖项

时间:2013-10-28 14:01:17

标签: c# inversion-of-control castle-windsor containers

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

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

上面的代码工作正常,我能够看到容器中继承MyPlugin的所有依赖项。假设我在容器中继承了MyPluginAMyPluginB的类,我想要检索MyPlugin。我应该怎么做呢?

由于

1 个答案:

答案 0 :(得分: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>()));