Unity IoC用于动态解析程序集

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

我们的代码

Public interface IPlugin { Void ProcessData(); } Public class DataProcessor { Var pluginList = unityContainer.ResolveAssemblies() /* 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 */ } 

供应商的集会

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

您可以编写一些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); 

(代码可能无法编译)

  var assemblies = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "Worker*.dll").Select(f => Assembly.LoadFile(f)).ToArray(); (from asm in assemblies from t in asm.GetExportedTypes() where typeof(ICommonWorker).IsAssignableFrom(t) && t.IsClass select t).ForEach(x => { unityContainer.RegisterType(typeof(ICommonWorker), x, x.FullName, new ContainerControlledLifetimeManager()); }); 

如果有人还在乎,这就是我动态加载DLL的方法,它实现了一个特定的接口(ICommonWorker)。