如果您只想知道解决方案,请跳到“更新”部分:
我有一个应用程序,使用以下代码获取并运行许多工作方法。
这段代码目前可以完美运行。然而,一些最新的工作利用依赖注入来填充它们的构造函数,因此这种方法将来将不可行。所以我想知道是否有一种使用Unity的方法来解决这个问题?
我的原始想法是继续使用前半部分,然后用resolve替换foreach逻辑,使其看起来像以下内容。
问题在于,一旦我定义了UnityContainer,实现IJob的返回类型列表就会突然膨胀,显示出所有这些垃圾Microsoft.Practices类,如下所示。
更新:
事实证明,当反射程序集时,如果存在Unity,则将尝试反射到Unity的程序集中,如果使用ToList完成,则由于缺少IServiceLocator的元数据扩展而抛出异常。为解决此问题,在GetAssemblies()后附加一个where子句,以限制范围为您想要的命名空间,即可使应用程序正常运行。
我有一个应用程序,使用以下代码获取并运行许多工作方法。
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();
}
这段代码目前可以完美运行。然而,一些最新的工作利用依赖注入来填充它们的构造函数,因此这种方法将来将不可行。所以我想知道是否有一种使用Unity的方法来解决这个问题?
我的原始想法是继续使用前半部分,然后用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类,如下所示。
更新:
事实证明,当反射程序集时,如果存在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();
}
types
列表中获取接口 - 你能否请澄清一下你所说的“我的类型返回”是什么? - Alexei Levenkovtypes.ToList().Count()
的结果吗?我怀疑您发布的截图并不是您正在寻找的列表... - Alexei Levenkov