2009-10-07 70 views
2

我有一個爲所有DataAccess使用WCF的應用程序。它返回一些業務對象,它有一些操作。我應該在哪裏將Comparers放入使用WCF的應用程序中?

此代碼是否應存在於我的客戶端或我的服務中?如果在服務中,我應該如何實現它?我可以簡單地將它添加爲我的業務對象的接口嗎?這是通過WCF服務代理代碼實現的嗎?

(這是從MSDN的樣本,我想在我實現我自己能得到一些反饋,但是這將是99%相同)

// Custom comparer for the Product class. 
class ProductComparer : IEqualityComparer<Product> 
{ 
    // Products are equal if their names and product numbers are equal. 
    public bool Equals(Product x, Product y) 
    { 

     // Check whether the compared objects reference the same data. 
     if (Object.ReferenceEquals(x, y)) return true; 

     // Check whether any of the compared objects is null. 
     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 

     // Check whether the products' properties are equal. 
     return x.Code == y.Code && x.Name == y.Name; 
    } 

    // If Equals() returns true for a pair of objects, 
    // GetHashCode must return the same value for these objects. 

    public int GetHashCode(Product product) 
    { 
     // Check whether the object is null. 
     if (Object.ReferenceEquals(product, null)) return 0; 

     // Get the hash code for the Name field if it is not null. 
     int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode(); 

     // Get the hash code for the Code field. 
     int hashProductCode = product.Code.GetHashCode(); 

     // Calculate the hash code for the product. 
     return hashProductName^hashProductCode; 
    } 
} 

回答

2

請記住,在WCF傳輸的數據(或通過任何種類的基於SOAP的服務)僅爲消息。它們沒有任何行爲(它不會互操作),所以你所有的好行爲都將在翻譯中失去。

這意味着你只有一個選擇:你的業務邏輯必須駐留在服務中,因爲它不能駐留在客戶端。

也就是說,有幾種方法可以在服務和客戶端之間共享代碼,但除非您純粹將WCF用作通信堆棧,否則不建議這樣做,因爲它會將客戶端和服務綁定在一起,並使其幾乎不可能獨立地改變這兩者(更不用說讓新客戶使用該服務)。

+0

優秀 - 說得好! – 2009-10-07 19:31:38

+0

多數民衆贊成我以爲 - 所以我需要做一個方法,暴露這個比較從我的WCF服務公開? – Nate 2009-10-07 19:58:41

+0

我的目標是能夠在客戶端做到這一點,做我自己的比較:productsA.Except(productsB)(其中兩個都是IEnumerable)。 – Nate 2009-10-07 20:00:13

3

那麼,WCF生成的代理是partial類,所以即使您使用的是mex代,您也可以在客戶端添加行爲。你也可以使用程序集共享(/reference在命令行,或選中IDE中的方框) - 然後你可以在客戶端和服務器上使用完全相同的類型,但是它破壞了大多數「純」的規則, SOA。

這取決於你覺得多「純」,我想。純粹的,但不得不維護兩個類似的代碼庫的痛苦可能超過了方便但是大會共享的骯髒。這取決於應用程序是什麼。我很高興在很多場合都使用過彙編,我覺得沒有罪惡感;這是該場景最明智的選擇。

只要記住,客戶端代碼是方便 - 始終把客戶作爲敵對的,所以即使你客戶使用裝配共享,請記住,一個敵對的客戶可能沒有,所以不會堅持你的規則;始終在服務器上進行驗證。

+0

我認爲最好在客戶端執行此操作,因爲此比較的最終結果僅用於顯示目的。 – Nate 2009-10-07 20:51:29

相關問題