废话少说,先上代码
public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,string suffix)
public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,string suffix)
{
if (!String.IsNullOrEmpty(assemblyName))
{
Assembly assembly = Assembly.Load(assemblyName);
List<Type> types = assembly
.GetTypes()
.Where(x => !x.IsInterface && x.Name.Contains(suffix) && !x.IsGenericType)
.ToList();
var result = new Dictionary<Type, Type[]>();
foreach (var item in types)
{
var interfaceType = item.GetInterfaces();
result.Add(item, interfaceType);
}
return result;
}
return new Dictionary<Type, Type[]>();
}
实际就是载入指定的DLL(根据DLL名字载入),然后过滤出非泛型且符合后缀的实现类(一般仓储,业务都有固定的后缀,可以自己定义命名规则,例如XXXReository, XXXService等),并且找到实现类所继承的接口(根据我设想,最好是一个接口一个实现,如果遇到一个接口多个实现的地方,尽量自己手工注入,以免引起不必要的误会),进行单元测试,示例如下
单元测试结果,发现没有问题,都可以找准
实际就是载入指定的DLL(根据DLL名字载入),然后过滤出非泛型且符合后缀的实现类(一般仓储,业务都有固定的后缀,可以自己定义命名规则,例如XXXReository, XXXService等),并且找到实现类所继承的接口(根据我设想,最好是一个接口一个实现,如果遇到一个接口多个实现的地方,尽量自己手工注入,以免引起不必要的误会),进行单元测试,示例如下
[TestMethod]
public void BatchDITestMethod()
{
var accessImpleAndInterfaces= AssemblyHelper.GetImpleAndInterfaces("DJMS.DataAccess","Access");
foreach(var v in accessImpleAndInterfaces)
{
Console.WriteLine($"class={v.Key},interface={v.Value[0]},{v.Value.Length}");
}
Console.WriteLine($"Access接口及实现个数为:{accessImpleAndInterfaces.Count}");
var logicImpleAndInterfaces = AssemblyHelper.GetImpleAndInterfaces("DJMS.BusinessLogic", "Logic");
foreach (var v in logicImpleAndInterfaces)
{
Console.WriteLine($"class={v.Key},interface={v.Value[0]},{v.Value.Length}");
}
Console.WriteLine($"Logic接口及实现个数为:{accessImpleAndInterfaces.Count}");
}
单元测试结果,发现没有问题,都可以找准
class=DJMS.DataAccess.Repository.DepartmentAccess,interface=DJMS.DataAccess.Repository