Как сохранить мою конфигурацию внедрения зависимостей (.NET Core)? - PullRequest
1 голос
/ 25 июня 2019

Я использую Microsoft.Extensions.DependencyInjection для Dependency Injection в .NET Core Console Application.

 public class Program
    {
        public IConfiguration Configuration { get; }
        public static void Main(string[] args)
        {
            IServiceCollection services = new ServiceCollection();
            Startup startup = new Startup();
            startup.ConfigureServices(services);

            IServiceProvider serviceProvider = services.BuildServiceProvider();
            var etlService = serviceProvider.GetService<IETLService>();              
        }
    }

 public class Startup
    {
        IConfigurationRoot Configuration { get; }

        public Startup()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json");
                Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
    {
        var sqlServerConnectionString = Configuration.GetConnectionString("SqlServerConnection");

        services.AddDbContext<ETLSqlContext>(options =>
            options.UseSqlServer(sqlServerConnectionString), ServiceLifetime.Scoped);

        services.AddSingleton(Configuration);
        services.AddTransient<ISqlRepository, SqlRepository>();
        services.AddTransient<IAzureSqlRepository, AzureSqlRepository>();
        services.AddTransient<IExtractService, ExtractService>();
        services.AddTransient<ILoadService, LoadService>();
    }
 }

 public class ExtractService : IExtractService
    {
        public ISqlRepository SqlRepository { get; set; }
        public IAzureSqlRepository AzureSqlRepository { get; set; }
        public ExtractService(ISqlRepository sqlRepository, IAzureSqlRepository azureSqlRepository)
        {
            SqlRepository = sqlRepository;
            AzureSqlRepository = azureSqlRepository;
        }        
    }

По мере роста решения будет появляться больше услуг, например, 50+, и для каждой услуги потребуется зарегистрировать свои Interface и Implementation class в Startup.cs для Dependency Injection. Мне нужно знать, есть ли лучший способ реализовать Dependency Injection, который не требует добавления новых сервисов Interface и Implementation class вручную в регистрационный код

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

В главе 12 Внедрение зависимостей, принципы, практики и шаблоны , Марк Симанн и я описываем, что при работе с DI-контейнером существует несколько параметров конфигурации, а именно:

  • Файлы конфигурации - отображение указывается в файлах конфигурации (обычно в формате XML или JSON)
  • Configuration as Code - код явно определяет сопоставления
  • Auto-Registration - Правила используются для определения местоположения подходящих компонентов с помощью отражения и для построения отображений.

В настоящее время вы подаете заявление Configuration as Code. Однако, используя Auto-Registration, вы применяете Convention over Configuration для регистрации компонентов вашего приложения с использованием отражения на основе указанного соглашения.

В разделе 12.3 мы подробно описываем, когда вам следует использовать DI-контейнер, и как вам следует его использовать. В итоге мы заявляем, что:

Использование Convention over Configuration с использованием Auto-Registration может минимизировать объем обслуживания на Composition Root почти до нуля.

Поэтому мы советуем:

a Composition Root следует либо сфокусировать на Pure DI с, возможно, несколькими типами с поздним связыванием, либо около Auto-Registration с, необязательно, ограниченным количеством Configuration as Code и конфигурационные файлы. Composition Root, который фокусируется вокруг Configuration as Code, не имеет смысла, и поэтому его следует избегать.

В главах 6 и 10 книги мы также описываем типы конструкций, которые вы можете использовать, которые, среди прочего, максимизируют соглашение по конфигурации и, вместе с ним, сводят к минимуму объем обслуживания вашей конфигурации DI.

0 голосов
/ 25 июня 2019

Я сделал это, добавив класс для каждого из моих проектов «PluginConfiguration», который передает IServiceCollection и регистрирует свои отдельные сервисы в конструкторе. Затем просто вызываю каждый «Плагин» в ServicesCollection в моем главномпроект.Он абстрагирует конфигурацию в класс, относящийся к отдельному проекту, и поддерживает основной конфигурацию в чистоте, используя только одну строку кода для каждого дополнительного проекта

...