我想在我的域驱动设计项目中使用外部第三方Web服务,但我无法理解我应该在哪个层访问外部Web服务。在域服务中但我不这么认为,因为域服务仅适用于域对象。但我的要求是,我必须根据外部webservice的输入执行操作列表,我必须在域服务中执行另一项任务。我很困惑。
答案 0 :(得分:5)
您可以做的是,根据域项目中的域模型介绍所需服务的界面。每当您的域中的某个类需要该服务时,您都会向其传递对此接口的实现的引用。
然后创建一个“连接器实现”,它实现此接口并连接到您需要使用的Web服务。当您启动应用程序时,您将为您的域类提供此实现,例如使用依赖注入框架。
此连接器具有对您的域模型和Web服务定义的引用。您的域模型没有引用连接器实现或Web服务 - 它只知道域项目中定义的接口。这称为控制反转。
这样,您的域类对Web服务一无所知,只了解您在域模型中定义的接口。因此,您的域逻辑与“邪恶的”外部世界保持分离。
答案 1 :(得分:4)
您需要新的应用程序服务才能访问外部Web服务。如前所述,您可以将服务实现注入到域对象中。
请参阅Eric Evans的“Domain Driven Design”的第105页。或者,请参阅我的回答here以了解DDD中不同类型的服务。
答案 2 :(得分:2)
我想说有几种选择:
1)如前所述,创建一个代表某种域服务的接口,并创建一个调用webservice的具体实现。
2)如果只在需要时调用服务,例如确认订单后,您可以使用“域事件”(请参阅http://www.udidahan.com/2009/06/14/domain-events-salvation/)
让Order.Confirm()方法引发OrderConfirmed事件并拥有一个响应事件的事件处理程序并从那里调用webservice。 事件处理程序和服务引用可以存在于使用域层的应用程序层中。
3)如果web服务的结果可以被视为域概念,您可能能够为结果创建一个实体,并且可以从Web服务结果创建该实体的存储库,从而隐藏它是外部数据的事实
答案 3 :(得分:1)
据我所知,您需要使用外部Web服务来执行某些操作。如果操作意味着您的业务逻辑,我认为正确的位置将在您的业务逻辑层。在您的上下文中,您只需使用它们。 在需要计算产品价格的情况下,您会在哪里拨打计算增值税的外部电话?
我希望它有道理: - )