Вы можете добавить свои услуги, используя определенные критерии и отражения, как показано ниже:
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)