ASP.Net Core内置依赖注入功能是否支持服务的自动注册?我不想像这样手动重复它们:
services.Add(new ServiceDescriptor(typeof(IUserService),
new UserService(new AtmDbContext())));
答案 0 :(得分:3)
对于我的项目,以下内容帮助了我:
在 Startup.cs 方法配置服务中添加行:
services.AddHandlers("Project name");
并执行:
public static IServiceCollection AddHandlers(this IServiceCollection services, string assemblyName)
{
var assemblyPath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), assemblyName + ".dll");
var assembly = Assembly.Load(AssemblyLoadContext.GetAssemblyName(assemblyPath));
var classTypes = assembly.ExportedTypes.Select(t => IntrospectionExtensions.GetTypeInfo(t)).Where(t => t.IsClass && !t.IsAbstract);
foreach (var type in classTypes)
{
var interfaces = type.ImplementedInterfaces.Select(i => i.GetTypeInfo());
foreach (var handlerType in interfaces.Where(i => i.IsGenericType))
{
services.AddTransient(handlerType.AsType(), type.AsType());
}
}
return services;
}
答案 1 :(得分:0)
我也很生气并为此建立了一个开源项目,看看:
https://github.com/SharpTools/SharpDiAutoRegister
只需添加nuget包SharpDiAutoRegister
并在ConfigureServices方法中添加您的约定:
services.ForInterfacesMatching("^I[a-zA-z]+Repository$")
.OfAssemblies(Assembly.GetExecutingAssembly())
.AddSingletons();
services.ForInterfacesMatching("^IRepository")
.OfAssemblies(Assembly.GetExecutingAssembly())
.AddTransients();
//and so on...