Есть ли способ уменьшить количество сервисных инъекций, которые у меня есть в классе запуска в ASP.NET ядро?

#c# #asp.net-core #dependency-injection #asp.net-core-3.1

#c# #asp.net-core #внедрение зависимостей #asp.net-core-3.1

Вопрос:

Я разрабатываю API с использованием .net core и собираюсь использовать внедрение зависимостей, но я понял ConfigureServices(IServiceCollection services) , что мне не нравится, что метод в классе Startup забит сервисными инъекциями. Например…

 public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyConnection")));
        services.AddScoped<IServiceOne, ServiceOne>();
        services.AddScoped<IServiceTwo, ServiceTwo>();
        services.AddScoped<IServiceThree, ServiceThree>();
        services.AddScoped<IServiceFour, ServiceFour>();
        //more and more services. This could go on and on and that would make the whole class ugly
    }
  

Есть ли способ поместить все эти службы в один класс и вызвать их в классе запуска?
Я использую asp.net3.1.

Спасибо.

Комментарии:

1. Извлеките нужный код в отдельный метод. Или создайте метод расширения, принимающий an IServicesCollection , который регистрирует нужные вам службы. Это то, что AddDbContext делает

2. Я не совсем понимаю. Не могли бы вы любезно направить меня по ссылке или статье, где я могу это увидеть?

Ответ №1:

AddDbContext это метод расширения, который настраивает и регистрирует DbContext производный класс IServicesCollection . Вы можете использовать тот же шаблон и создавать свои собственные методы расширения, которые добавляют определенные сервисы, например :

 static class MyExtensions
{
    static IServiceCollection AddMyServices(this IServiceCollection services)
    {
        services.AddScoped<IServiceOne, ServiceOne>();
        services.AddScoped<IServiceTwo, ServiceTwo>();
        services.AddScoped<IServiceThree, ServiceThree>();
        services.AddScoped<IServiceFour, ServiceFour>();

        return services;
    }
}
  

Вы могли бы разделить регистрации на связанные службы, например AddAccounting , AddInventory на основе модулей или сценариев вашего приложения, поместив все регистрации, необходимые для определенного модуля, в одно место, например :

 static IServiceCollection AddAccounting(this IServiceCollection services)
{
    var connection=Configuration.GetConnectionString("MyConnection");
    services.AddDbContext<Account>(options => options.UseSqlServer(connection));
    services.AddDbContext<Transaction>(options => options.UseSqlServer(connection));
    services.AddScoped<IServiceOne, ServiceOne>();
    services.AddScoped<IServiceTwo, ServiceTwo>();

    return services;
}

static IServiceCollection AddInventory(this IServiceCollection services)
{
    var connection=Configuration.GetConnectionString("MyConnection");
    services.AddDbContext<Warehouse>(options => options.UseSqlServer(connection));
    services.AddDbContext<Product>(options => options.UseSqlServer(connection));
    services.AddScoped<IServiceThree, ServiceThree>();

    return services;
}