Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependencies 内部密封等级是否与适当的DI垂直?_Dependencies_Code Injection_Mapper - Fatal编程技术网

Dependencies 内部密封等级是否与适当的DI垂直?

Dependencies 内部密封等级是否与适当的DI垂直?,dependencies,code-injection,mapper,Dependencies,Code Injection,Mapper,在阅读了Mark Seemann关于依赖注入的书之后,我对将我的团队从服务定位器反模式转移到一个更优雅的解决方案感到非常兴奋,在这个解决方案中,我的DI从未出现在我们的代码中。虽然我们有一个接口,它将我们与我们选择的DI容器分离,但我总是觉得我们过于依赖容器,同时无法充分利用它,我认为有很多很好的理由转向构造函数注入+抽象工厂模式 我的问题与政策和程序有关:我们试图遵循与T相关的坚实原则。我们还将我们的类标记为内部密封,除非它们有(明显的)理由不这样做。这在过去一直很好,因为它可以防止我们违反我

在阅读了Mark Seemann关于依赖注入的书之后,我对将我的团队从服务定位器反模式转移到一个更优雅的解决方案感到非常兴奋,在这个解决方案中,我的DI从未出现在我们的代码中。虽然我们有一个接口,它将我们与我们选择的DI容器分离,但我总是觉得我们过于依赖容器,同时无法充分利用它,我认为有很多很好的理由转向构造函数注入+抽象工厂模式

我的问题与政策和程序有关:我们试图遵循与T相关的坚实原则。我们还将我们的类标记为内部密封,除非它们有(明显的)理由不这样做。这在过去一直很好,因为它可以防止我们违反我们的“代码到接口”理念,因为所有跨越程序集边界可见的都是接口,只有通过容器才可用

在实践Mark Seemann的建议时,我突然想到我的类需要是公共的,这样复合根就能够将所需的组件组合在一起。当构建一个共享库时,这似乎尤其正确,该库不应假定其引用代码将使用容器,尤其是容器的风格

在构建从一个程序集的对象映射到另一个程序集的映射器时,我也得出了这个结论。例如,我可能有一个Models.Interfaces层,业务层和存储库层使用它来来回传递数据。以前,我们只需要制作一个程序集,在Models.Interface中实现契约,业务和存储库在需要Model.Interface的新实例时都会使用服务定位器。如果没有服务定位器,我唯一的选择似乎是要么删除模型接口,要么在同一个项目中实现我的Model.Interfaces,从而允许业务/存储库根据需要创建新实例


撇开性能不谈,我想知道Model.Interfaces项目中是否有公共模型实现是一种设计味道,我想知道内部密封类是否可以与这种DI方法相协调,当涉及到对接口编码和使用构造函数注入+抽象工厂DI模式时,我是否遗漏了一些东西。

没有明确的方向,我决定保持我目前的架构,即只有一个接口层,这是另外两个层之间的通信契约。我为每个模型创建了一个单独的IModelFactory接口(就像一个迷你服务定位器lite),其中包含一个Create()方法,我需要能够从任一层完成。然后,我将此接口注入每一层,这样他们就可以在不使用外部依赖项上的新关键字的情况下创建DTO。

“一个更优雅的解决方案,其中我的DI从未出现在我们的代码中”:如果您能完全实现这一点,请告诉我如何实现。我还没有找到一个正确的方法。如果(factoryBuiltObj是IDisposable)((IDisposable)factoryBuiltObj.Dispose(),我不想在代码中散布
,如果你明白我的意思。你的问题的解决方案可能看起来有点类似吗?@stakx在我看来,如果一个实现需要idisposable,而其他实现不需要idisposable,那么对象设计(ie接口)就不完整。对我来说,这违反了liskov(L inSOLID),您的接口应该实现idisposable,或者-如果您不能更改接口,那么您应该创建一个新的接口来实现原始接口,以便清楚地传达意图和依赖关系。