design-patterns - 处理具有项目之间共享依赖关系的 IoC 配置

标签 design-patterns dependency-injection configuration inversion-of-control

我有一个根项目 (root)、一些模块 (AB),并且这些模块具有一些外部依赖项 ( Z)。我正在使用 IoC 容器。

我在这里使用 C#,但这是一个通用模式问题。假设我的容器是 services,我可以使用扩展方法初始化 IoC 配置。所以在 root 项目中我写的是:

services.AddModuleA();
services.AddModuleB();

在模块A上我有这个方法:

public static void AddModuleA(this IServiceCollection services)
{
    // Init module internal services.
    //services.AddScoped<IA1Service, A1Service>();
    //...

    // Init module external dependencies.
    services.AddDependencyZ();
}

在模块B上我有一个类似的方法:

public static void AddModuleB(this IServiceCollection services)
{
    // Init module internal services.
    //...

    // Init module external dependencies.
    services.AddDependencyZ();
}

显然已经添加了 Z 依赖项,所以这告诉我不应该在模块扩展方法中配置它,而我应该在 root 中声明它的配置项目:

services.AddModuleA();
services.AddModuleB();
services.AddDependencyZ();

但这是否违反了最少知识原则?导入和配置模块A(或B)将带来所有依赖配置的级联显式声明。

相关问题是,声明扩展方法 AddModuleA()AddModuleB() 是一个糟糕的模式吗?直接在我将使用的仅限 root 的服务上进行配置可能是一个更好的主意吗? 在这种情况下(有点极端),内部使用类的配置怎么样?

最佳答案

假设这些扩展方法是在您的应用程序的 Composition Root 中定义的,为什么不直接从 AddModuleAAddModuleB 中删除对 AddDependencyZ 的调用呢?

public static void AddModuleA(this IServiceCollection services)
{
    // Init module internal services.
    //services.AddScoped<IA1Service, A1Service>();
    //...
}

public static void AddModuleB(this IServiceCollection services)
{
    // Init module internal services.
    //...
}

然后,您将在编写时在组合根中配置容器(这是 RRR pattern 中的注册阶段):

services.AddModuleA();
services.AddModuleB();
services.AddDependencyZ();

这是否违反了最少知识原则?是的,确实如此,但这是使用 DI 容器的众多缺点之一。

我推荐Pure DI而不是使用 DI 容器。这将使问题消失,因为OP中的所有代码都是多余的。

关于design-patterns - 处理具有项目之间共享依赖关系的 IoC 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56280553/

相关文章:

design-patterns - 输入端口在整洁架构中的作用

oop - 我们是否应该始终使用工厂而不是使用 'new' 关键字创建对象?

oop - 面向对象设计,定义关系

angularjs - 您可以将依赖项注入(inject)现有的 Angular 应用程序吗?

java - 在 Eclipse 的 'VM arguments' 部分中设置 java.util.logging.config.file 属性时出现问题

configuration - elasticsearch 多个 nic 绑定(bind)网络接口(interface)

design-patterns - 谁应该实例化和分配运行时策略实现?

android - 如何使用 Dagger 2.11 注入(inject)模拟

AngularDart 依赖注入(inject)

java - Struts2.5.12 - 使用 ActionSupport 中的 getText 方法时的 NPE