我们正在使用统一作为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
*/
}
供应商的集会
Public class AbcCompanyPlugIn : IPlugin
{
Void ProcessData()
{
// some code
}
}
Public class XyzCompanyPlugIn : IPlugin
{
Void ProcessData()
{
// some code
}
}
答案 0 :(得分: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);
(代码可能无法编译)
答案 1 :(得分:3)
var assemblies = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "Worker*.dll").Select(f => Assembly.LoadFile(f)).ToArray<Assembly>();
(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)。