Domain driven design 在域驱动设计中使用外部Web服务

Domain driven design 在域驱动设计中使用外部Web服务,domain-driven-design,dns,Domain Driven Design,Dns,我想在我的域驱动设计项目中使用外部第三方web服务,但我不知道应该在哪一层访问外部web服务。在域服务中,但我不这么认为,因为域服务仅用于域对象。但我的要求是,我必须根据外部Web服务的输入执行操作列表,我必须在域服务中执行另一项任务。我很困惑。从我的猜测来看,您需要使用外部web服务来执行一些操作。如果你是指你的业务逻辑,我认为正确的位置应该在你的业务逻辑层。在你的上下文中,你只需要使用它们。 如果您需要外部dll来计算产品价格,您会在哪里调用外部dll来计算增值税 我希望它有意义:-)您可以

我想在我的域驱动设计项目中使用外部第三方web服务,但我不知道应该在哪一层访问外部web服务。在域服务中,但我不这么认为,因为域服务仅用于域对象。但我的要求是,我必须根据外部Web服务的输入执行操作列表,我必须在域服务中执行另一项任务。我很困惑。

从我的猜测来看,您需要使用外部web服务来执行一些操作。如果你是指你的业务逻辑,我认为正确的位置应该在你的业务逻辑层。在你的上下文中,你只需要使用它们。 如果您需要外部dll来计算产品价格,您会在哪里调用外部dll来计算增值税


我希望它有意义:-)

您可以做的是,根据您的域项目中的域模型,为所需的服务引入一个接口。每当域中的类需要该服务时,您都会向它传递一个对此接口的实现的引用

然后创建一个“连接器实现”,它实现这个接口并连接到需要使用的Web服务。当您启动应用程序时,您可以为域类提供此实现,例如使用依赖项注入框架

此连接器引用了您的域模型和web服务定义。您的域模型没有引用连接器实现或Web服务-它只知道域项目中定义的接口。这称为控制反转


这样,域类对web服务一无所知,只知道在域模型中定义的接口。因此,您的域逻辑与外部世界的“邪恶”保持分离。

我想说有两种选择:

1) 如前所述,创建一个表示某种domainservice的接口,并创建一个调用webservice的具体实现

2) 如果只需要在发生某些事情时(例如订单确认时)调用服务,则可以使用“域事件”(请参阅)

让Order.Confirm()方法引发一个OrderConfirm事件,并具有一个响应该事件并从那里调用webservice的事件处理程序。 事件处理程序和服务引用可以存在于使用域层的应用程序层中


3) 如果可以将Web服务的结果视为域概念,则可以为结果创建一个实体,并创建一个从Web服务结果创建此实体的存储库,从而隐藏它是外部数据的事实。

您需要一个新的基础结构服务来访问外部Web服务。正如前面所建议的,您可以将服务实现注入到域对象中


参见Eric Evans的“领域驱动设计”第105页。或者,请参阅我的答案以了解DDD中不同类型的服务。

您告诉我创建应用程序服务,并将其注入域对象。可能吗?域对象无法访问应用程序服务。怎样?其他人告诉我在域服务中做什么。这里一团糟。@Vijay在我的域中我有广告客户和出版商实体,我想允许广告客户将资金存入其余额中,该余额是广告客户的一部分(从PayPal转移资金,成功转移后,我们将增加其余额),与取款和取款出版商实体相同。现在,为了支持转账,Paypal需要各种参数,为此我创建了各种实体,这些实体被填充为例如-:PaymentInfo,我们将它们传递给Paypal或任何支付网关。那么,我应该把我的域中的所有实体放在哪里呢。我是否为转账或应用层创建支付聚合和域服务。这是非常错误的@chandra。依赖关系从内部到外部,而不是相反。域永远不能使用应用程序服务,但是,应用程序服务可以并且应该在执行或请求时使用域。阅读更多关于清洁建筑的鲍勃叔叔,他说得很清楚。您可以做的一件事是从域启动域事件,应用程序层中相应的事件处理程序执行它们的操作。看起来像是基于您的另一个答案的基础结构服务或域服务,当然不是应用程序服务。即使这样,也写下了外部服务消费者应用服务,而不是其他方式…@inf3rno:谢谢你指出这一点!那一年我一定是在为圣诞节做准备(或者可能是喝醉了)。实际上,我想为我的应用程序paypal Authorization.net创建支付处理器。我创建了它,它也有很多实体,比如IPaymentMethod、PaymentInfo等。但我无法断定我是否创建单独的聚合并将所有这些实体放在那里,并创建域服务,域服务将接收数据填充的实体并将它们传递给paypal或authorize.net,然后等待状态消息。我所做的。付款处理部分是否属于我的域内部,我无法得出结论。请帮助.IMO,无论您选择哪种解决方案都可以,只要您的域类不依赖于paypal和authorize.net。因此,支付处理可能是您的领域的一部分:如果是的话,那么就这样做,并选择适当的抽象和接口,您可以通过paypal/auth.net实现这些抽象和接口。听起来你走对了方向;如果你把依赖关系弄对了,情况就更糟了。解决问题的方法有很多,而且总是会有不同的意见。也许你应该在你原来的问题上多加一些细节?您希望Do在需要时访问数据,还是由其他触发器提供数据?请提供更多细节。