0

我想在我的MVC網絡應用程序中使用WCF。我已經實現了通道工廠來實例化代理客戶端。 我被困在一個點。下面是代碼的亮點 -使用Unity註冊WCF代理封裝器

我創建了一個代理基類,我在哪裏創造出聲道:

public abstract class ServiceProxyBase<T> : IDisposable where T : class 

爲了創建德代理包裝類,我繼承了這個基類:

public class ProxyWrapper : ServiceProxyBase<IMyService>,IMyService 

這裏「IMyService」是WCf合同。

現在,在控制器我已經加入重載構造爲:

public class AccountController : Controller 
{ 
    private IMyService businessService; 

    public AccountController(IMyService _businessService) 
    { 
     this.businessService = _businessService; 
    } 
} 

用於注入依賴性我已經包括unity.mvc4包。

它正常工作時,我用下面的代碼:

container.RegisterType<IMyService, ProxyWrapper>(); 

這工作只要ProxyWrapper直接繼承IMyService接口。如果我刪除繼承

public class ProxyWrapper : ServiceProxyBase<IMyService> 

它註冊類型時會給出錯誤。 我想有一個方法,而不會在代理封裝器中禁止合約。我花了將近一天的時間來解決這個問題。但我們能夠找出解決方案。

請給出您的寶貴意見。

+0

所以你想註冊'ProxyWrapper'作爲'IMyService',但不讓'ProxyWrapper'實現'IMyService'?你想用這個解決什麼問題? – Steven 2014-11-25 10:11:00

+0

是的,我想按照提及的方式來實現它。我沒有試圖解決任何問題。只是試圖以更清潔的方式實現它,這樣我就不必在包裝器中實現合同的所有方法。只有我需要的應該包括在內。 – Shikhar 2014-11-25 10:47:44

+0

@Steven - 有沒有辦法做到這一點? – Shikhar 2014-11-25 10:55:33

回答

1

如果我理解正確,您的應用程序正在使用WCF服務,但您的應用程序所需的功能與服務提供的功能(它包含的方法多於您需要的)相比是有限的。根據Interface Segregation Principle,「沒有客戶應該被迫依賴它不使用的方法」,並且Dependency Inversion Principle指出客戶擁有抽象。

換句話說,您應該定義應用程序應該使用的自己的接口,並定義一個包裝(即composition over inheritance)生成的WCF代理類的實現。

例如:

public interface IMyApplicationService 
{ 
    object GetStuff(); 
    void PutStuff(object instance); 
} 

public class MyServiceApplicationProxy : IMyApplicationService 
{ 
    private readonly ProxyWrapper wcfProxy; 

    public MyServiceApplicationProxy(ProxyWrapper wcfProxy) { 
     this.wcfProxy = wcfProxy; 
    } 

    public object GetStuff() { 
     return this.wcfProxy.GetStuff(); 
    } 

    public void PutStuff(object instance) { 
     this.wcfProxy.PutStuff(instance); 
    } 
} 

爲了使應用開發更容易,使代碼更容易閱讀,維護和測試。

您甚至可能希望更改界面的方法以更好地滿足您的應用程序需求。記住:客戶端定義了接口!所以這可能意味着您需要在MyServiceApplicationProxy類中進行更多映射,以將您的核心域調整爲外部Web服務的合約。不要讓外部WCF服務的合約泄漏到您的核心域中。