Orchardcms 如何阻止两个果园模块冲突

Orchardcms 如何阻止两个果园模块冲突,orchardcms,autofac,orchard-modules,Orchardcms,Autofac,Orchard Modules,我有两个果园模块 两者都有IAppSettings的实现,它在外部dll中定义,并通过nuget包在模块中引用(因此我不能使用IDependency) 我在每个模块中使用Autofac模块类将这些连接起来 不幸的是,这会导致“最后一次注册获胜”,两个模块都将使用最后一次注册的实现,即使“预期”结果是每个模块都使用自己的实现 明确地说,每个模块都是由一个单独的团队开发的,他们不相互协调,但使用相同的模块创建指南。上面的例子只是发生这种情况的一个例子,但可以公平地假设还会有更多 我该如何确保每个团队

我有两个果园模块

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

我在每个模块中使用Autofac模块类将这些连接起来

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

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


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

每个租户都有一个Autofac容器,而不是每个(Orchard)模块。你知道这意味着什么

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

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


例如,您可以实现策略模式,而不需要为您的接口要求特定的实现什么样的DI。但是如果你告诉我更多的细节,我可以提供更多的帮助。

更新:我能管理的最好方法就是使用autofac的命名注册。例如,在模块B builder.Register(c=>new-AppSettings(“ModuleB”)).Named(“ModuleB”).SingleInstance()中;在消费者公共模块控制器(ILifetimeScope scope){u provider=scope.ResolveNamed(“ModuleB”);}中,感觉不太好,因为需要更多地意识到冲突的可能性。他说:如果你需要一个接口的具体实现,有一个非常有名的机制,它不是依赖注入,而是“新的”。使用“新的”不是企业级的。至少使用一个工厂!:-D开发人员A不知道开发人员B,并且两者都同样希望在其控制器中使用接口,然后在autofac中连接注册(因为在这个特定区域中,我们不能使用IDependency)。我理解为什么“是”-我在询问关于如何在开发时提供明确指导的建议,以避免无意中重写另一个模块代码,而这不是我的意图。我所能做到的最好的是,我们有7个不同的团队管理将部署到一个orchard主机中的独立模块。到目前为止,我得到的最好的是命名注册。您是否有信心为此需要DI,例如,为了仍然能够切换实现?对于每个模块,您也可以使用工厂(一个返回IAppSettings的IDependency工厂,其中实现是一个简单的实例化),(IAModuleAppSettingsFactory,IBModuleAppSettingsFactory…)。同样,您可以使用strategy模式,使用一个方法从注入的IEnumerable中返回必要的实现。