2015-06-29 82 views
0

我發現自己被吸引到在這種情況下使用兩個相同的接口,看起來不正確。然而,替代方案似乎是從我的服務中使用WCF裝飾的界面,這也感覺不對。WCF設計:避免接口複製

示例如下

這裏是接口爲我的WCF服務

[ServiceContract(Namespace="http://MyNameSpace")] 
public interface IGetDataService 
{ 
    [OperationContract] 
    List<MyDataObject> GetData(); 
} 

現在,讓我們說服務只能從數據庫獲取數據。我需要一個實現來促進這種檢索。這個類是否也應該實現IGetDataService,因爲方法是相同的?或者我應該有另一個接口,打了個比方,IDataRepository:

public interface IDataRepository 
{ 
    List<MyDataObject> GetData(); 
} 

注意,這個接口是相同的IGetDataService在簽名的條款。唯一的區別是缺乏WCF相關的屬性。

class DatabaseDataRepository: IDataRepository 
{ 
    public List<MyDataObject> GetData() 
    { 
     // code to query database here 
     // return populated List<MyDataObject> 
    } 
} 

至於WCF服務本身(完整性)的實現:

class DataService: IGetDataService 
{ 
    public List<MyDataObject> GetData() 
    { 
     var repository = MyIocContainer.GetInstance<IDataRepository>(); 
     return repository.GetData(); 
    } 
} 

因此,要總結:我需要在內部IDataRepository或者是可重複使用的IGetDataService?

我相當有信心都會工作 - 對設計最佳實踐感興趣。

回答

1

這確實是一個偏好問題。

我會使用兩個不同的接口。這是一個更高的開銷,但它允許兩個合約在不同方向上彎曲。

例如,如果您的WCF服務需要公開新服務,則不必更改存儲庫接口。

+0

謝謝@Derek Van Cuyk。同意你的陳述。另外,考慮一下,有兩個接口的代碼對於需要檢測的代碼來說會更清晰。在服務中使用IGetDataService的實現可能有點混亂 – GinjaNinja