Внедрение зависимостей для интерфейсов, не известных Composition Root - PullRequest
0 голосов
/ 20 октября 2019

Я использую библиотеки классов .NET Standard (2.1) и .NET Core 3.0 в качестве веб-API, поэтому библиотека Microsoft.Extensions.DependencyInjection, хотя я подозреваю, что это не имеет большого значения.

ОбщееПрактика говорит, что мой корень композиции (проект API) должен координировать все необходимые реализации для интерфейсов приложения.

Как мне справиться с этим, когда у меня есть интерфейсы, неизвестные проекту Web API, для которого я хочу настроить внедрениеfor?

Например, стек зависимостей типа CQRS:

MyProject.Web.API, depends on:
    MyProject.MyService, which depends on:
        MyProject.MyService.Command
            MyProject.MyService.Command.Data
        MyProject.MyService.Query
            MyProject.MyService.Query.Data

MyProject.Web.API не знает, что существуют проекты данных, но каждый из этих проектов данных имеет ICommandDbContextили IQueryDbContext там, где я хочу обработать.

Я не могу установить их в корне композиции, не раскрывая интерфейсы более низкого уровня вплоть до проекта Web API, который совершенно не нужен длялюбая другая причина. Как я могу справиться с DI в этих проектах более низкого уровня?

1 Ответ

1 голос
/ 20 октября 2019

Это потребует, чтобы эти нижние уровни предоставили точку расширения, чтобы позволить ей взаимодействовать с контейнером, чтобы заполнить его необходимыми зависимостями

Например,

MyProject.MyService

public static class MyServiceProjectExtension {
    public IServiceCollection AddMyServiceDependencies(this IServiceCollection services) {
        services.AddDbContext<ICommandDbContext, CommandDbContext>(...);

        //...

        return services;
    }
} 

И корень Композиции вызывает точку расширения из сервисного проекта

MyProject.Web.API

public void ConfigureServices(IServiceCollection services) {

    services.AddMyServiceDependencies();

}

Это означаетоднако, что MyProject.MyService будет принимать прямую зависимость от Microsoft.Extensions.DependencyInjection.Abstractuions, чтобы быть в курсе структуры DI.

...