Unity IoC用于动态解析程序集

bha*_*lad 3 c# inversion-of-control unity-container

我们使用统一作为IoC.我们遇到了独特的问题.我们创建了名为IPlugin的接口.该接口在各种第三方供应商之间共享,以基于此接口开发自己的插件.然后这些插件适合我们的系统.供应商将提供他们的插件作为DLL.我们想要的是,使用unity我们想要解析用IPlugin接口实现的所有程序集类型.我发现这可以通过MEF导出属性实现,我想知道这是否可以通过Unity使用一些简短的扩展来实现.

我们的代码

Public interface IPlugin
{
    Void ProcessData();
} 

Public class DataProcessor
{
    Var pluginList = unityContainer.ResolveAssemblies<IPlugIn>()
/*
There is no such method in unity but what we want is scan all assemblies in bin folder and load all types which are inheriting from IPlugIn
*/
}
Run Code Online (Sandbox Code Playgroud)

供应商的集会

Public class AbcCompanyPlugIn : IPlugin
{
Void ProcessData()
{
// some code
}

}
Public class XyzCompanyPlugIn : IPlugin
{
Void ProcessData()
{
// some code
}

}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 5

您可以编写一些Reflection代码来扫描文件夹中的加载项程序集,并IPlugin使用容器注册所有实现.

这样的事情应该有效:

var assemblies = // read all assemblies from disk
var pluginTypes = from a in assemblies
                  from t in a.GetExportedTypes()
                  where typeof(IPlugin).IsAssignableFrom(t)
                  select t;

foreach (var t in pluginTypes)
    container.RegisterType(typeof(IPlugin), t);
Run Code Online (Sandbox Code Playgroud)

(代码可能无法编译)

  • 谢谢这帮助我开始了.但是,请注意`IsAssignableFrom(t)`将为类和接口返回true,因此您可能希望在迭代类型时添加对`IsClass`的检查.另外,通过在`container.RegisterType()`方法调用中不指定注册名称,您将使用下一个注册覆盖每个先前的注册(仅产生一个注册类型),因此将另一个参数添加到register方法中,每个注册方法具有唯一的名称键入你注册的`t.FullName`,以便可以注册多个类型来实现`IPlugin`. (2认同)