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