Unity IoC用于动态解析程序集

时间:2012-03-07 03:52:55

标签: 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
*/
}

供应商的集会

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

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

}

2 个答案:

答案 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)。