2015-10-15 57 views
1

有一項服務可與Customer實體一起使用。我應該爲每種服務方法創建單獨的DTO類嗎?

服務已經執行GetCustomer方法,該方法返回CustomerDTO

服務必須實施方法來更改客戶的Phone,Address,SalesManagerDiscount。客戶只能更改PhoneAddress,銷售總監只能更改客戶的SalesManager,而銷售經理只能更改客戶的Discount

  1. 我應該只創建一個服務方法ChangeCustomer
    • 我是否應該使用CustomerDTO作爲GetCustomer方法中的返回類型,例如, ChangeCustomer(CustomerDTO)
    • 我是否應該使用其他一些CustomerChangeDTO,例如ChangeCustomer(CustomerChangeDTO)
  2. 我應該創建一些服務方法ChangeCustomerPhoneChangeCustomerAddressChangeCustomerManagerChangeCustomerDiscount
    • 我是否應該在每種服務方法中使用CustomerDTO,例如, ChangeCustomerName(CustomerDTO),...?
    • 我應該在每個服務方法中使用單獨的DTO類,例如: ChangeCustomerName(CustomerNameChangeDTO),...?
  3. 也許一些其他的服務方法?

似乎單個DTO類使服務在客戶端上更容易使用,因爲所有客戶端必須要做的是請求CustomerDTO,更改它的一些屬性併發回。服務是處理CustomerDTO中的所有更改,並將業務邏輯應用於實體以及其他實體。

每個變種都有其他優點/缺點嗎?

回答

1

您的WCF服務位於應用程序層,因此它應該爲每個用例都有一個單獨的方法。很顯然你這裏有3用例:

  1. 客戶可以改變PhoneAddress
  2. 銷售總監可以改變SalesManager
  3. 銷售經理可以改變Discount

所以,你的服務應該公開3種方法。這些方法中的每一個都不僅需要更新Customer實體,還必須先檢查權限。如果你試圖用1種方法來實現它,那麼最終會出現很多if和不明確的行爲。例如,如果銷售經理嘗試更改DiscountPhone,該怎麼辦?忽略Phone?拋出異常?

每種方法都應該使用不同的DTO,只包含該方法所需的屬性。 (順便說一句,你可以在類名中將'DTO'改爲'Command' - 例如ChangeCustomerDiscountCommand,看起來比'DTO'更好看)。

如果你使用一個DTO,這將是客戶端混亂(爲什麼在班上有其他屬性?如果我離開他們空會發生什麼?如果我改變他們,會發生什麼?等等)

相關問題