Упростите внедрение зависимостей с помощью сервисов.AddScoped by Folder

В современной разработке программного обеспечения решающее значение имеет создание модульных и легко поддерживаемых приложений. Одним из важных аспектов достижения этой цели является правильная организация вашей кодовой базы. В этой статье мы рассмотрим метод, использующий метод services.AddScopedв.NET Core в сочетании со структурой на основе папок, чтобы упростить внедрение зависимостей и улучшить организацию кода.

Что такое внедрение зависимостей?
Прежде чем углубляться в детали, давайте быстро вспомним, что такое внедрение зависимостей (DI). DI — это шаблон проектирования, который позволяет отделить компоненты вашего приложения, предоставляя зависимости из внешних источников, а не создавая их внутри самого компонента. Это способствует слабой связи и улучшает тестируемость и удобство обслуживания.

Проблема традиционной регистрации DI:
При типичной настройке DI вы регистрируете свои зависимости одну за другой, используя метод services.AddScopedв методе ConfigureServicesвнутри вашего класс стартапа. Этот подход хорошо работает для небольших приложений, но может стать громоздким и сложным в обслуживании по мере увеличения размера и сложности проекта.

Организация кода по папкам.
Чтобы решить эту проблему, давайте воспользуемся структурой на основе папок для организации нашего кода. Вместо того, чтобы регистрировать зависимости одну за другой, мы можем создать соглашение, в котором каждая папка представляет определенный модуль или функцию в нашем приложении. Каждая папка содержит необходимые классы и интерфейсы, относящиеся к этому модулю.

Реализация сервисов.AddScoped по папкам:
Чтобы упростить регистрацию DI, мы можем создать вспомогательный метод, который автоматически сканирует структуру папок проекта и регистрирует зависимости, обнаруженные в каждом модуле. Вот пример реализации:

public static void RegisterServicesByFolder(this IServiceCollection services, Assembly assembly)
{
    var types = assembly.GetTypes()
        .Where(t => t.IsClass && !t.IsAbstract)
        .ToList();
    var moduleTypes = types.Where(t => t.Namespace.EndsWith(".Modules")).ToList();
    foreach (var moduleType in moduleTypes)
    {
        var interfaces = moduleType.GetInterfaces();
        foreach (var @interface in interfaces)
        {
            var implementation = types.FirstOrDefault(t => @interface.IsAssignableFrom(t));
            if (implementation != null)
            {
                services.AddScoped(@interface, implementation);
            }
        }
    }
}

В этом примере мы используем отражение для сканирования сборки проекта на наличие всех классов в пространстве имен Modules. Для каждого модуля мы получаем реализованные интерфейсы и регистрируем их с помощью services.AddScoped. Такой подход устраняет необходимость ручной регистрации и позволяет автоматически обнаруживать зависимости на основе структуры папок.

Преимущества использования сервисов.AddScoped by Folder:

  1. Упрощенная регистрация DI: благодаря такому подходу вам больше не нужно вручную регистрировать каждую зависимость, что сокращает объем стандартного кода.
  2. Улучшенная организация кода. Организовав код в папки, представляющие модули или функции, становится легче находить и понимать различные части вашего приложения.
  3. Масштабируемость и удобство обслуживания. По мере роста вашего проекта добавление новых модулей или функций становится более простым, поскольку регистрация DI выполняется автоматически.

Объединив возможности services.AddScopedсо структурой организации кода на основе папок, вы можете упростить настройку внедрения зависимостей и повысить удобство сопровождения ваших приложений.NET Core. Такой подход сокращает объем ручного труда, улучшает организацию кода и способствует масштабируемости. Используйте этот метод, чтобы с легкостью создавать модульные и удобные в обслуживании приложения.