【问题标题】:Castle Windsor - resolving dependencies based on class nameCastle Windsor - 基于类名解决依赖关系
【发布时间】:2013-10-28 14:01:17
【问题描述】:

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

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

上面的代码运行良好,我可以看到容器中所有继承 MyPlugin 的依赖项。假设我有类MyPluginAMyPluginB 继承自容器中的MyPlugin,我想检索MyPluginA。我该怎么办?

谢谢

【问题讨论】:

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


    【解决方案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>()));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多