以下实施支付网关的实现在应用服务中是否正确

时间:2011-04-06 20:26:00

标签: domain-driven-design

 This is my interface

    public partial interface IPaymentMethod
    {
       void ProcessPayment(PaymentInfo paymentInfo, Customer customer, 
       Guid orderGuid, ref ProcessPaymentResult processPaymentResult);
       void Capture(Order order, ref ProcessPaymentResult processPaymentResult);
       void Refund(Order order, ref CancelPaymentResult cancelPaymentResult);
    }

我想在PaypalPaymentProcessor.cs和AuthorizeNet.cs

中实现这个接口
    public class PayPalExpressPaymentProcessor : IPaymentMethod
    {
      public void ProcessPayment(PaymentInfo paymentInfo, Customer customer, Guid   orderGuid, ref ProcessPaymentResult processPaymentResult)
      {
         //Some code
      }
      void Capture(Order order, ref ProcessPaymentResult processPaymentResult)
      {
         // Some Code
      }
      void Refund(Order order, ref CancelPaymentResult cancelPaymentResult)
      {
         // Some Code
      }
   }

//对于AuthorizNetPaymentProcessor类相同。这两个类都用于支付网关。但我很困惑,我把上面的接口和类放在 App Service中。因为这两个类都不适合作为域的一部分而不适合域服务。

是否可以将它们放入App Service并在应用程序服务中创建PaymentService类,我将从中调用它们。我可以这样做吗?

2 个答案:

答案 0 :(得分:1)

您的问题描述非常简短,但我会尽力回答。您的问题是您想要使用支付网络服务的网关/ Wrapper类吗?对不起?

如果方案是您要在应用程序中使用支付Web服务,并且在应用程序服务层中更具体。然后,方法应该是将您的支付Web服务网关/包装器放在基础结构层(在另一个程序集/项目中)并使用dependncey注入在构造函数中插入网关。我不确定PayPalExpressPaymentProcessor在图片中的位置。但我想那是与支付服务对话的网关类。

因此,您可能在应用程序层中有一个CustomerService,它将在构造函数(Depency注入)中获取IPaymentService(网关/包装器)并调用IPaymentService.ProcessPayment(...)方法。这种服务方法实际上是在实现的 基础设施层。然后您的应用程序服务CustomerService也可以通过ICustomerRepository调用域,这也是通过构造函数(DI)启动的。

也许这不是你的问题场景?希望我能帮到你......

答案 1 :(得分:1)

嗯... 评论似乎不起作用。 StackOverFlow需要在这里处理他们的AJAX请求....

Kamal你在“应用层与外部服务对话”的陈述中是正确的。但该短语也意味着外部系统应该能够使用与表示层相同的Application Service API。 应用程序服务使用者可以是ASP.NET Web客户端,IPhone应用程序,SAP或IFS等业务系统。 但我的意思是,不应在应用程序服务层中引用所有与基础架构相关的依赖项。复杂化可能是一段时间后你的应用服务层引用了一个GemBox Excel第三方组件,WCF,MSMQ客户端等。每次你想要切换第三方产品,更新许可证,升级到更新版本时,这将重新替换应用层版。在我看来,对于一个简单的任务来说维护太大了。您还可以轻松地对从应用程序到域层,然后模拟电子邮件,wcf,msmq服务的所有内容进行单元测试。

在应用程序服务层中应该具有的是服务的接口和实现以及在另一个程序集/项目中实现的基础结构服务(包装器/适配器/您命名)的接口。然后你只在你的infra项目中有wcf参考。你听懂了吗?如果你愿意,我可以发布一些代码示例....