温莎城堡 - 根据类名解析依赖关系
本文关键字:依赖 关系 城堡 | 更新日期: 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>()));