Dependency injection 组合根用户不知道的接口的依赖项注入

Dependency injection 组合根用户不知道的接口的依赖项注入,dependency-injection,.net-core,Dependency Injection,.net Core,我使用.NET标准(2.1)类库和.NET Core 3.0作为web API,因此使用了Microsoft.Extensions.DependencyInjection库,尽管我怀疑这并不重要 一般实践表明,我的组合根(API项目)应该协调应用程序接口所需的所有实现 当我有我想要为其设置注入的Web API项目未知的接口时,如何处理这个问题 例如,CQRS类型依赖项堆栈: MyProject.Web.API, depends on: MyProject.MyService, which

我使用.NET标准(2.1)类库和.NET Core 3.0作为web API,因此使用了
Microsoft.Extensions.DependencyInjection
库,尽管我怀疑这并不重要

一般实践表明,我的组合根(API项目)应该协调应用程序接口所需的所有实现

当我有我想要为其设置注入的Web API项目未知的接口时,如何处理这个问题

例如,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


我无法在组合根目录中设置这些,而不将较低级别的接口一直公开给WebAPI项目,因为任何其他原因,这都是完全不必要的。我如何处理这些较低级别项目的DI

这将需要那些较低级别公开一个扩展点,以允许它与容器通信,从而用所需的依赖项填充它

比如说

MyProject.MyService


然而,这意味着
MyProject.MyService
将直接依赖于
Microsoft.Extensions.DependencyInjection.Abstractuions
,以便了解DI框架。

这将要求这些较低级别公开一个扩展点,以允许它与容器通信,并用所需的dependencies@Nkosi-这就是我想要避免的。似乎应该可以有比合成根本身更深的某种编排来处理这些情况,但我从未遇到过。
public static class MyServiceProjectExtension {
    public IServiceCollection AddMyServiceDependencies(this IServiceCollection services) {
        services.AddDbContext<ICommandDbContext, CommandDbContext>(...);

        //...

        return services;
    }
} 
public void ConfigureServices(IServiceCollection services) {

    services.AddMyServiceDependencies();

}