architecture - 在解析公共(public)类时注入(inject)内部帮助类

标签 architecture dependency-injection inversion-of-control autofac

我有以下架构,其中引用内部 Helper 类的公共(public)服务类存在于另一个程序集中:

ApplicationAssembly {
  public class Widget {
    public Widget(ReferencedAssembly.Service service) { ... }
  }
}

ReferencedAssembly {
  public class Service {
    public Service(Helper helper) { ... }
  }
  class Helper { ... }
}

(我意识到我不能将内部类放在公共(public)类的构造函数的参数中——我只是想说明我所追求的 IoC 模式。)

问题是 ApplicationAssembly看不到 ReferencedAssembly.Helper ,所以它不能在我的 IoC 容器中注册(在这种情况下是 Autofac)。结果,Helper尝试解决时无法解决Service .我在这里最好的选择是什么?
  • 选项 1:删除 Helper来自 Service的构造函数并在构造函数中显式地新建它。我不喜欢这个选项,因为它有点打破了 IoC 范式。
  • 选项 2:制作 Helper实现公共(public)IHelper接口(interface),然后在 ReferencedAssembly 中添加一个公共(public)模块注册 Helper作为 IHelper .我不喜欢这个选项,因为它需要 ApplicationAssembly了解太多关于 Service 的实现细节,如果用户忘记在启动时注册该模块,一切都会中断。
  • 选项 3:在 Service 上创建公共(public)静态构造函数专门为 ReferencedAssembly 构建第二个 IoC 容器并注册 Helper在里面。删除 Helper来自 Service的构造函数并使用第二个 IoC 容器在构造函数中解析它。这似乎是我最好的选择,但需要比其他更多的“管道”代码。我也不是公共(public)静态构造函数的忠实粉丝。
  • 选项 4. 将我的架构完全更改为其他东西。
  • 最佳答案

    使用 Autofac 注册内部类型的方法是包含 Autofac Module在具有内部类型的程序集内,并将模块注册到容器中。因为模块在同一个程序集中,它可以配置 ContainerBuilder与内部类型。

    我认为最好的选择是制作 Service实现一个公共(public)接口(interface),然后使 Service您当前拥有的内部类(class)。 Autofac 会很高兴地实例化一个内部类来提供一个公共(public)接口(interface)。

    另一个选项(允许 Service 使构造函数依赖于内部类型)是使 Service的构造函数内部,然后使用 Service 中的构造函数查找器类型注册:

    builder.RegisterType<Service>()
      .FindConstructorsWith(new BindingFlagsConstructorFinder(BindingFlags.NonPublic));
    

    关于architecture - 在解析公共(public)类时注入(inject)内部帮助类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4775323/

    相关文章:

    c# - .NET 集成框架

    asp.net - Web Api - 每个数据库实体或每个 UI 屏幕的 Controller

    entity-framework - 有没有办法让 ASP.NET 5 依赖注入(inject)在没有引用的情况下解析 DbContext?

    php - Laravel 4 - 子构造函数通过依赖注入(inject)调用父构造函数

    java - 基于运行时提供的字符串查找要使用哪个接口(interface)实现的优雅解决方案

    c# - 是否可以使用反序列化进行构造函数注入(inject)?

    android - 在来自服务器的多个数据源的客户端上显示分页数据

    visual-studio-code - VS Code 的架构

    java - @InjectMocks 通过构造函数和 setter 注入(inject) @MockBean 无法正常工作

    generics - 如何从处理未知类型的多个来源安全地加载代码?