c#-获取在Unity中实现接口的所有类型
作者:互联网
如果您只想知道解决方案,请跳至UPDATE:
我有一个使用以下代码来获取和运行许多辅助方法的应用程序
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();
}
此代码按原样完美工作.但是,一些较新的作业利用依赖项注入来填充其构造函数,因此,此方法将不可行.所以我想知道是否有办法做到这一点?
我最初的想法是,我将继续上半部分,然后将foreach逻辑替换为resolve,以便其外观类似于以下内容.
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的话,当重新考虑Assembly时,它将尝试反映到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();
}
解决方法:
而不是搜索所有程序集,而是通过自定义属性对其进行筛选.这样,您可以极大地缩小搜索范围.
这是创建自定义程序集级别属性的方法
标签:dependency-injection,unity-container,c 来源: https://codeday.me/bug/20191120/2046167.html