我应该为每个Service方法创建一个单独的DTO类吗?

时间:2015-10-15 20:39:07

标签: c# web-services wcf architecture soa

有一个服务可以使用Customer实体。

服务已经实现了GetCustomer方法,该方法返回CustomerDTO

服务必须实施更改客户PhoneAddressSalesManagerDiscount的方法。允许客户仅更改PhoneAddress,允许销售总监仅更改客户的SalesManager,而允许销售经理仅更改客户的Discount

  1. 我应该只创建一种服务方法ChangeCustomer吗?
    • 我应该使用CustomerDTO GetCustomer作为ChangeCustomer(CustomerDTO)方法中的返回类型,例如CustomerChangeDTO
    • 我应该使用其他ChangeCustomer(CustomerChangeDTO),例如ChangeCustomerPhone
  2. 我应该创建多种服务方法ChangeCustomerAddressChangeCustomerManagerChangeCustomerDiscountCustomerDTO吗?
    • 我应该在每种服务方法中使用ChangeCustomerName(CustomerDTO),例如ChangeCustomerName(CustomerNameChangeDTO),...?
    • 我是否应该在每种服务方法中使用单独的DTO类,例如CustomerDTO,...?
  3. 也许是其他一些服务方法?
  4. 似乎单个DTO类使服务更容易在客户端上使用,因为所有客户端必须做的是请求CustomerDTO,更改其中的一些属性并发回。服务是处理Customer中的所有更改,并将业务逻辑应用于真实this.class.classLoader.parseClass("/home/jenkins/GitlabPostbuildReporter.groovy") GitlabPostbuildReporter.newInstance(manager).report() 实体以及其他实体。

    每种变体还有其他优缺点吗?

1 个答案:

答案 0 :(得分:1)

您的WCF服务位于应用程序层中,因此每个用例都应该有一个单独的方法。你在这里显然有3个用例:

  1. 客户可以更改PhoneAddress
  2. 销售总监可以更改SalesManager
  3. 销售经理可以更改Discount
  4. 所以你的服务应该暴露3种方法。这些方法中的每一个都不仅要更新Customer实体,还必须先检查权限。如果您尝试在1方法中实现它,您将会遇到很多if和不明确的行为。例如,如果销售经理尝试更改DiscountPhone,该怎么办?忽略Phone?抛出异常?

    每个方法都应使用不同的DTO,仅包含该方法所需的属性。 (顺便说一句,您可以在班级名称中更改&#39; DTO&#39;命令&#39;例如ChangeCustomerDiscountCommand。看起来比DTO&#39;更好。< / p>

    如果您使用单个DTO,那么客户会感到困惑(为什么课堂上还有其他属性?如果我将它们留空会发生什么?如果我更改它会怎么样?等等。)