我公司很少开发像花哨的网络商店,财务系统,请求/结果API等......相反,对于许多应用程序,我们甚至不需要在我们这边存储数据,因此不需要存储库,实体。我们主要做的是为网络设备和设施创建管理系统。这意味着:DDD和基础架构庞大的'域' - DDD在这里失败了吗?
- 整个“域”是基础设施为主,随着数以百计的同步,状态协议
- 我们的大多数系统提供的内部插件写的功能,其中的配置,数据和方法紧密耦合
- 即使这是不好的做法,对于我们的东西,我们经常需要配置超出规定
现在我想知道 - 是DDD适用在这里吗?业务层是基础架构层时,将业务逻辑与基础架构层分开是否有意义?你有这种情况下的任何经验吗?怎样才能利用某些例如基础设施问题进入领域?
编辑
我道歉,如果我不清楚我的声明“当商业逻辑是基础设施层”。我非常清楚DDD中两层的目的和边界,但请参阅此示例:
客户端希望您编写SNMP设备管理软件。他并不关心SNMP本身,因为他甚至可能不理解协议,但他确实关心可以被视为“域”的“设备管理”部分。现在,SNMP是基于二进制数据的TCP/IP协议,并且有点复杂。如果你要自己写一个客户端实现,那么在接下来的几周内你可能就不会完成了。所以你会怎么做?你使用一个框架,一个包含所有幻想魔法的库,让你快速入门。
现在,SNMP是一个非常'动态'的协议。当你问设备的配置时,你不知道你真正得到了什么。但是您希望将此配置存储到数据库中(使用您的存储库),因为客户端要求您这样做。因此,您可以创建像十几个值对象,类等来表示设备可以具有的功能。但是SNMP库呢?那么,它为它自己的类提供了SNMP设备可以提供的每种可能的类型。而且由于该域永远不应该与基础设施层耦合,因此您只需花一天时间将映射器从域实体创建到SNMP类。
好,很好。一旦你完成了,客户端还有另一个要求:如果设备不再可用,他希望得到一个电子邮件。所以你创建你的email-sender-service,写一些业务逻辑,从配置文件中获取客户端的电子邮件。什么时候会发生什么?当然,当设备不可达时 - 您只能在基础设施层检测到。因此,你需要找到一种方法来通知域层关于基础设施层上的事件,例如,使用事件总线。再次,您需要从您的域层中的基础架构层引入一个概念:“DeviceNotReachableEvent”,它已经存在于SNMP库中。
您看到了哪里?对于基础架构层的每个问题,您必须在域图层中创建一个挂件,因为您的域是基于“外部”基础架构的东西。当然,网络上发生的事情是一个域名要求,但没有任何需要在没有DDD的情况下做近两次相同的事情。
请记住,DDD最重要的方面不是战术模式。 – plalx