Dependency injection 组合根用户不知道的接口的依赖项注入
我使用.NET标准(2.1)类库和.NET Core 3.0作为web API,因此使用了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
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();
}