随着我们依赖注入框架的最新添加(春季注释),创建 DI 管理组件的边际成本似乎已经达到了一些关键的新阈值。虽然以前有与 spring 相关的开销(大量的 XML 和额外的间接),但依赖注入似乎已经开始出现在许多模式所在的地方;他们进入引擎盖并“消失”。
这样做的结果是与大量组件相关的概念开销变得可以接受。有争议的是,我们可以创建一个系统,其中大多数类只公开一个公共方法,并通过疯狂地聚合这些部分来构建整个系统。在我们的例子中,给出了一些东西;应用程序的用户界面有一些功能需求,这些需求塑造了最顶层的服务。后端系统控制下部。但是在这两者之间,一切都可以争夺。
我们经常讨论的是为什么我们要在类中分组,原则应该是什么?有几件事是确定的;立面图案已死并被掩埋。任何包含多个不相关功能的服务也往往会被拆分。“不相关的特征”的解释比我之前所做的要严格得多。
在我们的团队中,这里有两种流行的思路:实现依赖限制分组;单个类中的任何功能最好是所有注入依赖项的客户端。我们是一个 DDD 项目,而另一部分则认为域限制了分组(CustomerService 或更细粒度的 CustomerProductService、CustomerOrderService)——注入依赖项的规范化使用并不重要。
那么在松散耦合的 DI 世界中,为什么我们将逻辑分组到类中?
编辑:duffymo 指出这可能正在朝着函数式编程风格发展;这就提出了国家的问题。我们有相当多的“状态”对象代表相关应用程序状态的(小)片段。我们将这些注入到任何对该状态有合法需求的服务中。(我们使用“状态”对象而不是常规域对象的原因是 spring 在未指定的时间构造这些对象。我认为这是一个轻微的解决方法或替代解决方案,让 spring 管理域对象的实际创建。可能有更好的解决方案这里)。
因此,例如,任何需要 OrderSystemAccessControlState 的服务都可以注入它,而消费者并不容易知道这些数据的范围。一些与安全相关的状态通常用于许多不同的级别,但在中间的级别上完全不可见。我真的认为这从根本上违反了功能原则。从 OO 的角度来看,我什至很难适应这个概念——但只要注入的状态是精确的并且是强类型的,那么需求就是合法的,也就是用例是合适的。