在Asp.net core中,使用反射加载程序集,手动挺扫描所有的服务依赖,然后将这个服务依赖添加到服务容器中,具体实现代码如下:
namespace MyCore.Infrastructure.Dependency
{
public static class Ioc
{
public static void ResolveAllTypes(this IServiceCollection services, string solutionPrefix, params string[] projectSuffixes)
{
//solutionPrefix 解决方案名称
//projectSuffixes 需要扫描的项目名称集合
//注意: 如果使用此方法,必须提供需要扫描的项目名称
var allAssemblies = new List<Assembly>();
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
foreach (var dll in Directory.GetFiles(path, "*.dll"))
allAssemblies.Add(Assembly.LoadFile(dll));
var types = new List<Type>();
foreach (var assembly in allAssemblies)
{
if (assembly.FullName.StartsWith(solutionPrefix))
{
foreach (var assemblyDefinedType in assembly.DefinedTypes)
{
if (projectSuffixes.Any(x => assemblyDefinedType.Name.EndsWith(x)))
{
types.Add(assemblyDefinedType.AsType());
}
}
}
}
var implementTypes = types.Where(x => x.IsClass).ToList();
foreach (var implementType in implementTypes)
{
//接口和实现的命名规则为:"AService"类实现了"IAService"接口,你也可以自定义规则
var interfaceType = implementType.GetInterface("I" + implementType.Name);
if (interfaceType != null)
{
services.Add(new ServiceDescriptor(interfaceType, implementType,ServiceLifetime.Scoped));
}
}
}
}
}在startup.cs中的ConfigureServices中,使用:
Ioc.ResolveAllTypes(services, "MyCore", "Repository", "Service")