组合根未知的接口的依赖注入

时间:2019-10-20 19:56:35

标签: dependency-injection .net-core

我正在使用.NET Standard(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不知道数据项目存在,但是每个数据项目中都有一个我要处理的ICommandDbContextIQueryDbContext

我不能在组合根目录中进行设置,而不必将底层接口一直暴露到Web API项目中,这出于任何其他原因都是完全不必要的。如何在这些较低级别的项目上处理DI?

1 个答案:

答案 0 :(得分:1)

这将要求较低的级别公开扩展点,以使其能够与容器进行通信,以使用所需的依赖项来填充它。

例如

MyProject.MyService

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

        //...

        return services;
    }
} 

Composition根调用服务项目中的扩展点

MyProject.Web.API

public void ConfigureServices(IServiceCollection services) {

    services.AddMyServiceDependencies();

}

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