Реализация внедрения зависимостей из нового файла

#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-клиентов и т. Д. И т. Д.