Как избежать регистрации сервиса в startup.cs - PullRequest
0 голосов
/ 20 марта 2020

В asp. net ядре мы должны зарегистрировать сервис, чтобы использовать его, но когда сервисы увеличиваются, что мы должны делать? Как и в приведенном ниже коде, у меня просто есть ShopService что делать, если у меня более 50 услуг.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddDbContext<SGAContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("SGAContext")));
    services.AddScoped<DbContext, SGAContext>();
    services.AddScoped<IShopService, ShopService>();
}

Каков наилучший способ минимизировать эту ситуацию.

1 Ответ

2 голосов
/ 20 марта 2020

Вы можете добавить свои услуги, используя определенные критерии и отражения, как показано ниже:

public static IServiceCollection AddScopedImplementations<T>(this IServiceCollection services)
{
    var types = typeof(T).Assembly.GetTypes().Where(_ => !_.IsAbstract && _.IsClass && typeof(T).IsAssignableFrom(_));

    foreach (var t in types)
        services.AddScoped(t);

    return services;
}

Идея метода AddScopedImplementations состоит в том, чтобы добавить все типы, которые реализуют определенный интерфейс

I Я сканирую ту же сборку, в которой реализован интерфейс.

Затем, чтобы получить все типы, реализующие интерфейс, Startup.ConfigureServices можно изменить, например

services.AddScopedImplementations<IConverterToDb>();
services.AddScopedImplementations<IMapperLink>();

. Он сканирует сборку, в которой IConverterToDb интерфейс и регистрирует все IConverterToDb реализации, которые не являются абстрактными

Вы можете использовать тот же подход с регистрациями типа интерфейса, как пустые IScopedServiceToBeAdded или пометить ваши типы сервисов с помощью атрибута для реализации автоматизации c services.AddScoped<IShopService, ShopService>() registrations

public interface IShopService : IAutoRegistration
{}
public interface ShopService : IShopService
{}

, затем вы можете сканировать все интерфейсы, полученные из IAutoRegistration (например, IShopService), и использовать этот список, чтобы найти типы, которые реализуют производные интерфейсы ShopService

, затем вы можно поместить найденные пары интерфейса - класса в services.AddScoped(tinterface, tclass)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...