温莎城堡 - 根据类名解析依赖关系

本文关键字:依赖 关系 城堡 | 更新日期: 2023-09-27 18:37:11

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

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

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

谢谢

温莎城堡 - 根据类名解析依赖关系

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

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

container.Register(
    Component.For<MyPlugin>.Named(MyPluginA.ID).ImplementedBy<MyPluginA>());
ID

可以是类的名称,也可以是任何唯一的字符串 ID。为了解决这个问题,你让温莎为你实现一个可以接受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>()));