我想加载所有类型的接口,以便我可以在其上调用方法。但是,程序集未引用编译时。它们将位于bin文件夹中。
这是我可以轻松使用Unity做的事情吗?
例如,我的代码类似于:
using (var container = new UnityContainer())
{
container.RegisterType<IModule>();
var modules = container.ResolveAll(typeof(IModule));
foreach (IModule module in modules) { module.Logon(); }
Console.WriteLine("Done...");
Console.ReadLine();
}
当然,模块解析为空,因为程序集刚刚被放入bin文件夹中。它们在我当前的程序集中没有静态引用。
或者,我是否必须执行某种类型的Assemblies.LoadAssembly()。我希望这一点尽可能的动态。如果可能的话,我不必在配置文件或代码中指定程序集名称。
提前致谢。
答案 0 :(得分:3)
Unity本身不会加载任何程序集。它适用于Type对象,让CLR加载它们想要的那些类型。
要按照您的意愿进行动态发现,您需要编写一些代码来旋转bin目录中的程序集,将它们加载到内存中,然后旋转它们以查找您感兴趣的类型。如果您熟悉反射API,那将非常简单。
这里有一些代码可以用来遍历bin目录,并确保每个程序集都已加载:
private static bool ForceLoadAssemblies()
{
foreach (var fileName in Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll"))
{
string assemblyName = Path.GetFileNameWithoutExtension(fileName);
if (assemblyName != null)
{
Assembly.Load(assemblyName);
}
}
return true;
}
另一种选择是看MEF。 MEF是为动态发现案例明确设计的,而Unity更多是围绕内部依赖管理而构建的。