DependencyInjection是否支持服务的自动注册

本文关键字:注册 服务 是否 支持 DependencyInjection | 更新日期: 2023-09-27 18:26:20

ASP.Net Core内置的依赖注入功能是否支持服务的自动注册?我不想像这样手动重新设置它们:

services.Add(new ServiceDescriptor(typeof(IUserService), 
                   new UserService(new AtmDbContext())));

DependencyInjection是否支持服务的自动注册

对于我的项目,以下内容帮助了我:

Startup.cs方法ConfigureServices中添加行:

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

我也很恼火,为此构建了一个开源项目,看看:

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...