Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Domain driven design 面向服务的体系结构&;领域驱动设计_Domain Driven Design_Design Patterns_Soa - Fatal编程技术网

Domain driven design 面向服务的体系结构&;领域驱动设计

Domain driven design 面向服务的体系结构&;领域驱动设计,domain-driven-design,design-patterns,soa,Domain Driven Design,Design Patterns,Soa,我一直以SOA的方式开发代码。今年我一直在尝试做更多的DDD,但我一直觉得我没有得到它。在工作中,我们的系统是负载平衡的,并且设计为没有状态。架构是: 网站 ==物理层== 主要服务 ==物理层== 服务器1/服务2/服务3/服务4 只有服务器1、服务2、服务3和服务4可以与数据库通信,主服务根据订购的产品调用正确的服务。每个物理层也是负载平衡的 现在,当我开发一项新的服务时,我尝试在该服务中考虑DDD,尽管它感觉不太合适 我使用良好的DDD原则,如实体、值类型、存储库、聚合、工厂等 我甚至尝试

我一直以SOA的方式开发代码。今年我一直在尝试做更多的DDD,但我一直觉得我没有得到它。在工作中,我们的系统是负载平衡的,并且设计为没有状态。架构是:

网站

==物理层==

主要服务

==物理层==

服务器1/服务2/服务3/服务4

只有服务器1、服务2、服务3和服务4可以与数据库通信,主服务根据订购的产品调用正确的服务。每个物理层也是负载平衡的

现在,当我开发一项新的服务时,我尝试在该服务中考虑DDD,尽管它感觉不太合适

我使用良好的DDD原则,如实体、值类型、存储库、聚合、工厂等

我甚至尝试过使用ORM,但它们似乎不适合无状态体系结构。我知道有很多方法可以解决这个问题,例如使用IStatelessSession而不是与NHibernate的ISession。然而,ORM只是觉得它们不适合无状态体系结构

我注意到我实际上只使用DDD教给我的一些概念和模式,但总体架构仍然是SOA

我开始认为DDD不适合大型系统,但我确实认为一些模式和概念适合大型系统


就像我说的,也许我只是没有掌握DDD或者可能我过度分析了我的设计?也许通过使用DDD教给我的模式和概念,我正在使用DDD?我不确定这篇文章是否真的有问题,但我在试图弄清楚DDD在整个系统中的位置以及它真正的可扩展性时有了更多的想法。事实上,我甚至不知道DDD是什么

关于领域驱动设计,最重要的是大局观念:

  • 无处不在的语言
  • 通过在核心领域工作(并将自己与其他恶劣系统隔离)来增加价值的战略决策,以及
  • 通过将基础设施与业务逻辑分离,实现可测试、灵活设计的方法
这些都是广泛适用的,也是最有价值的作品

关于工厂、服务、存储库、聚合等等,有很多设计模式的东西,我认为这是一个有经验的开发人员对另一个开发人员的建议,而不是福音,因为其中的很多内容可能会因您使用的语言和框架而异。我认为他们往往被过分强调,因为像我们这样的程序员都是以细节为导向的,我们沉迷于这种东西。那里也有一些有价值的东西,但需要正确看待。因此,其中一些可能与您无关,或者在您使用它的过程中,它可能会对您产生影响

所以我想说,这不像是一个清单,你可以运行,以确保你使用所有的模式,这是一个保持大局的问题,并看到如何改变你的方法来开发软件。如果你从这些图案中得到一些好的提示,那也很棒


特别是在SOA方面,我开发了一些应用程序,这些应用程序将它们的所有状态都推迟到数据库,而数据库使用了持久性无关的域对象。为必须模拟DAO并反馈内容的服务编写测试是一件苦差事,我在域对象中放置的逻辑越多,我就越不必在服务中干扰模拟,因此我倾向于更喜欢这种方法。

我认为一个常见的误解是SOA和DDD是两种相互冲突的风格

在国际海事组织中,这两个概念紧密结合在一起; 您创建了一个封装域概念的域模型,并通过服务将入口点暴露到该模型中

我也不知道ORM和服务有什么问题,您可以很容易地在每次服务调用中使用会话/uow。 只需将您的服务操作建模为原子域命令

一个天真的例子:

[WebMethod]
void RenameCustomer(int customerId,string newName)
{
    using(var uow = UoW.Begin())
    {
        var customerRepo = new CustomerRepo(uow);
        var customer = customerRepo.FindById(customerId);
        customer.Rename(newName);
        uow.Commit();
    }
}
您可能面临的问题是,您创建了“UpdateOrder”之类的服务,它接受订单实体并尝试在新会话中更新它

我试图避免这种服务,而是将它们分解为更小的原子命令

每个命令都可以作为一个操作公开,也可以有一个服务操作来接收命令组,然后将这些命令委托给命令处理程序


在我看来,这样可以更好地展示您的意图。

DDD引入了一些概念,这些概念在构建SOA时可能会让您感到困惑

我必须完全同意,SOA服务公开了充当原子命令的操作。我相信一个非常干净的SOA使用消息而不是实体。然后,服务实现将利用域模型来实际执行操作

然而,DDD中有一个称为“域服务”的概念。这与应用程序服务略有不同。通常,“域服务”与域模型的其余部分使用相同的通用语言进行设计,并表示不完全适合实体或值的业务逻辑


域服务不应与应用程序服务混淆。事实上,应用程序服务可以很好地实现为使用域服务。毕竟,应用程序服务可以完全封装SOA中的域模型。

我在这方面做得真的很晚,但我想在其他人非常好的回答中添加以下内容

  • DDD与SOA没有任何冲突。相反,DDD可以帮助您维护更好的面向服务的体系结构。SOA促进了服务的概念,因此您可以在系统之间定义更好的边界(哦,上下文边界也是DDD概念!),并提高对它们的理解
  • DDD不是应用一组模式(例如存储库