【问题标题】:How to stop two orchard modules conflicting如何停止两个果园模块冲突
【发布时间】:2014-10-02 06:02:25
【问题描述】:

我有两个果园模块。

两者都有 IAppSettings 的实现,它在外部 dll 中定义,并通过 nuget 包在模块中引用(所以我不能使用 IDependency )。

我在每个模块中使用 Autofac 模块类将它们连接起来。

不幸的是,这会导致“最后一次注册获胜”,并且两个模块都将使用最后一次注册的实现,即使“预期”的结果是每个都使用自己的。

需要明确的是,每个模块都是由一个单独的团队开发的,他们不相互协调,但使用相同的模块创建指南。上面的例子只是这种情况的一个例子,但可以公平地假设还会有更多。

我如何才能确保每个团队都可以为其模块注册自己的依赖项,而不必经常与其他模块的作者核对?

【问题讨论】:

  • 更新:我能做到的最好的方法是使用 autofac 的命名注册。例如在模块 B builder.Register(c => new AppSettings("ModuleB")).Named("ModuleB").SingleInstance();在消费者 public ModuleBController(ILifetimeScope scope) { _provider = scope.ResolveNamed("ModuleB");感觉不太好,因为需要更多地意识到冲突的可能性。

标签: orchardcms autofac orchard-modules


【解决方案1】:

每个租户有一个 Autofac 容器,而不是每个(Orchard)模块。您会看到它的含义。

然而,这并没有太大的不同,因为如果将依赖关系限定为扩展,模块之间的交互将受到严重阻碍。

DI 的另一个要点是您可以覆盖实现:这也是需要的,因为如果您在模块 A 中实现依赖项,那么也在模块 B 中(其中模块 B 依赖于模块 A)然后是模块B 可以覆盖默认实现。这是一件好事。

例如,您可以实现策略模式,而不是希望为您的接口要求特定的实现什么样的失败 DI。但是,如果您提供更多详细信息,我可以提供更多帮助。

【讨论】:

  • 他说的是:如果你需要一个特定的接口实现,有一个众所周知的机制,它不是依赖注入,它是“新的”。
  • 使用“新”不是企业级的。至少使用工厂! :-D
  • 开发者 A 不知道开发者 B,两者都希望在他们的控制器中有一个接口,然后在 autofac 中连接注册(因为在这个特定领域我们不能使用 IDependency)。我理解为什么是“是” - 我正在寻求任何关于如何在开发时提供明确指导的建议,以避免无意中覆盖另一个模块代码,而这不是本意。我能做到的最好的我们有 7 个不同的团队管理将部署到一个果园主机中的独立模块。到目前为止,我得到的最好的就是命名注册。
  • 您是否有信心为此需要 DI,例如仍然能够切换实现吗?您也可以使用工厂(返回 IAppSettings 的 IDependency 工厂,其中实现是简单的实例化),每个模块:(IAModuleAppSettingsFactory,IBModuleAppSettingsFactory ...)。同样,您可以使用策略模式并拥有一个从注入的 IEnumerable. 返回必要实现的方法
猜你喜欢
  • 2014-06-21
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2013-06-21
相关资源
最近更新 更多