#c# #.net #asp.net-mvc #asp.net-core #dependency-injection
Вопрос:
Я работал над ASP.NET Проект Core 5 MVC, и он работает, как и ожидалось, единственная проблема, с которой я сейчас сталкиваюсь, — это размер файла Startup.cs, я использую Microsoft.Расширения.Зависимость очень большая, и это очень хорошо!, но, как я уже упоминал, она становится очень переполненной этими «услугами».AddTransient, область действия или одноэлементный», есть ли способ создать свой собственный класс для добавления этих служб и вызвать его из Startup.cs?.
До сих пор я пытался создать статический класс с помощью метода «Inject», который вернет коллекцию IServiceCollection, но это не работает, я искал в Google несколько примеров, но похоже, что это не «вещь».
Позвольте мне поделиться некоторыми примерами кода:
using FluentValidation;
using Microsoft.Extensions.DependencyInjection;
using Models;
namespace MyFirstAzureWebApp
{
public class Injections
{
private static readonly IServiceCollection _services;
public static IServiceCollection Inject()
{
_services.AddTransient<IValidator<Customer>, CustomerValidator>();
_services.AddTransient<IValidator<Requirement, RequirementValidator>();
_services.AddApplicationInsightsTelemetry(Configuration["APPINSIGHTS_CONNECTIONSTRING"]);
_services
.AddFluentEmail("noreply@myownmail.com")
.AddRazorRenderer()
.AddSmtpSender("smtp.myownmail.com",445);
return _services;
}
}
}
И при запуске.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews()
.AddFluentValidation(opt =>
{
opt.DisableDataAnnotationsValidation = true;
opt.ValidatorOptions.LanguageManager.Culture = new CultureInfo("es");
});
//Dependency Injetions call
services = Injections.Inject();
}
Я надеюсь, что этой информации достаточно, чтобы пролить некоторый свет на мою проблему.
Большое спасибо!
Ответ №1:
да, вы абсолютно можете это сделать. Я использую его все время, чтобы мой код был красивым и чистым. Вы можете легко сделать это с помощью методов расширения:
public class Injections
{
public static IServiceCollection RegisterServices(this IServiceCollection services) => services
.AddTransient<IValidator<Customer>, CustomerValidator>()
.AddTransient<IValidator<Requirement, RequirementValidator>();
public static IServiceCollection AddOtherServices(this IServiceCollection services, IConfiguration configuration) => services
.AddApplicationInsightsTelemetry(configuration["APPINSIGHTS_CONNECTIONSTRING"])
.AddFluentEmail("noreply@myownmail.com")
.AddRazorRenderer()
.AddSmtpSender("smtp.myownmail.com",445);
}
Затем в вашем Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews()
.AddFluentValidation(opt =>
{
opt.DisableDataAnnotationsValidation = true;
opt.ValidatorOptions.LanguageManager.Culture = new CultureInfo("es");
});
//Dependency Injetions call
services.RegisterServices();
services.AddOtherServices(Configuration);
}
Комментарии:
1. ДА… это сработало очень хорошо!, была небольшая проблема с «дополнительными сервисами», я получал эту ошибку «Не удалось привести объект типа» Microsoft. Расширения. Зависимость от инъекции. FluentEmailServicesBuilder» для ввода «Microsoft. Расширения. Зависимость от инъекции. IServiceCollection».», поэтому я решил оставить это и просто использовать» Службы регистрации», так как это пока самое большое. Большое вам спасибо за помощь @user15119845
Ответ №2:
Это довольно распространенная вещь (потому что да — здесь действительно бывает многолюдно!).
Один из подходов заключается в написании методов расширения на IServiceCollection, группирующих биты функциональности вместе.
Например, вы можете создать файл с именем DatabaseServices.cs
, который добавляет entity framework, или Dapper, или что-то еще.
// DatabaseServices.cs
public static class DatabaseServices
{
public static IServiceCollection AddDatabases(this IServiceCollection services)
{
// Set up Entity Framework
services.AddDbContext<MyContext>(/* configure EF */);
// Do other stuff related to databases.
// Return the service collection to allow chaining of calls.
return services
}
}
Тогда в Startup.cs
вы можете просто сделать:
// Startup.cs
services.AddDatabases();
Создайте другие файлы для добавления журналов, конфигурации, служб, HTTP-клиентов и т. Д. И т. Д.