编程语言
首页 > 编程语言> > c#-获取在Unity中实现接口的所有类型

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();
}

解决方法:

而不是搜索所有程序集,而是通过自定义属性对其进行筛选.这样,您可以极大地缩小搜索范围.

这是创建自定义程序集级别属性的方法

Custom Assembly Attributes

标签:dependency-injection,unity-container,c
来源: https://codeday.me/bug/20191120/2046167.html