Domain driven design 面向服务的体系结构&;领域驱动设计
我一直以SOA的方式开发代码。今年我一直在尝试做更多的DDD,但我一直觉得我没有得到它。在工作中,我们的系统是负载平衡的,并且设计为没有状态。架构是: 网站 ==物理层== 主要服务 ==物理层== 服务器1/服务2/服务3/服务4 只有服务器1、服务2、服务3和服务4可以与数据库通信,主服务根据订购的产品调用正确的服务。每个物理层也是负载平衡的 现在,当我开发一项新的服务时,我尝试在该服务中考虑DDD,尽管它感觉不太合适 我使用良好的DDD原则,如实体、值类型、存储库、聚合、工厂等 我甚至尝试过使用ORM,但它们似乎不适合无状态体系结构。我知道有很多方法可以解决这个问题,例如使用IStatelessSession而不是与NHibernate的ISession。然而,ORM只是觉得它们不适合无状态体系结构 我注意到我实际上只使用DDD教给我的一些概念和模式,但总体架构仍然是SOA 我开始认为DDD不适合大型系统,但我确实认为一些模式和概念适合大型系统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原则,如实体、值类型、存储库、聚合、工厂等 我甚至尝试
就像我说的,也许我只是没有掌握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不是应用一组模式(例如存储库