我正在使用.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不知道数据项目存在,但是每个数据项目中都有一个我要处理的ICommandDbContext
或IQueryDbContext
。
我不能在组合根目录中进行设置,而不必将底层接口一直暴露到Web API项目中,这出于任何其他原因都是完全不必要的。如何在这些较低级别的项目上处理DI?
答案 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框架。