如果您只想知道解决方案,请跳至更新:
我有一个应用程序,它使用以下代码来获取并运行许多工作方法
var type = typeof(IJob);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => x.IsClass && type.IsAssignableFrom(x));
foreach (Type t in types)
{
IJob obj = Activator.CreateInstance(t) as IJob;
obj.Run();
}
该代码按原样完美运行。然而,一些较新的作业利用依赖注入来填充其构造函数,因此这种方法今后将不再可行。所以我想知道是否有办法统一做到这一点?
我最初的想法是继续前半部分,然后用resolve替换foreach逻辑,使其看起来像下面这样。
var type = typeof(IJob);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => x.IsClass && type.IsAssignableFrom(x));
foreach (Type t in types)
{
IJob obj = Container.Resolve(t) as IJob;
obj.Run();
}
问题是,一旦我定义了 UnityContainer,实现 IJob 的返回类型列表就会突然因所有这些垃圾 Microsoft.Practices 类而变得臃肿,如下所示
UPDATE:
事实证明,在反映程序集时,如果 Unity 存在,它将尝试反映到 Unity 的程序集,如果使用 ToList 完成,则会由于缺少 IServiceLocator 的元数据扩展而引发异常。要解决此问题,请在 GetAssemblies() 之后附加一个 where 子句以将范围限制为所需的命名空间,这样应用程序就可以正常运行。
var type = typeof(IJob);
var types = AppDomain.CurrentDomain.GetAssemblies()
.Where(x => x.FullName.StartsWith("YourNamespace"))
.SelectMany(x => x.GetTypes())
.Where(x => x.IsClass && type.IsAssignableFrom(x));
foreach (Type t in types)
{
IJob obj = Container.Resolve(t) as IJob;
obj.Run();
}