2011-09-21 85 views
0

我需要一些指導。我有一個WCF服務,是一個更大的解決方案的一部分。目前,由於繼承問題,最終用戶必須引用太多的程序集。例如,這裏是我的基本的項目設置:避免將過多的程序集暴露給客戶端使用WCF服務

MyProject.Domain

namespace MyProject.Domain 
{ 
    public interface IFooable{} 

    public class Foo : IFooable{} 
} 

MyProject.Contracts

namespace MyProject.Contracts 
{ 
    [DataContract] 
    public class FooData : IFooable{} 

    [ServiceContract] 
    public class IFooService 
    { 
     IEnumerable<FooData> GetFoos(); 
    } 
} 

MyProject.Proxies

namespace MyProject.Proxies 
{ 
    public class WCFClient{} 
} 

問題就出在這裏:

class ConsumerCode 
{ 
    private WCFClient = new WCFClient(); 

    void consumeService() 
    { 
     // Compiler error. No reference to MyProject.Domain.IFooable 
     var foos = WCFClient.GetFoos(); 
    } 

這意味着最終的消費者誰使用FooData對象必須還包括一個參考MyProject.Domain,這很臭,因爲我不應該將業務邏輯層公開給WCF服務的最終客戶端。

有沒有辦法解決?

+0

Contracts.FooData實現Domain.IFooable有什麼好處嗎?如果你刪除這個依賴項,那麼你的域名空間對象就不會被公開。 – alexm

回答

2

它在合同中非常直接定義IFooable,而不是在域中。

這裏的邏輯是任何暴露給客戶的東西(根據定義)是合同或合同的一部分,而不是域實體。

+0

我絕對同意你的意見。但是,如果IFooable在合同組合中沒有意義呢?例如,我的特殊情況是Domain對象和Contract對象繼承自INotifiable接口,與通過服務公開的合同無關。 – Didaxis

+0

我想你說得對。 INotifiable接口是一個服務(雖然不是WCF服務)。我認爲在完全確信之前,我需要思考我的單獨程序集的語義定義。 – Didaxis

+1

如果無意義與合同無關,那麼您應該能夠從其繼承鏈中移除INotifiable。 – alexm

相關問題