2011-06-29 85 views
2

在我的業務層,我使用WCF服務。 WCF服務實例也可以在構造函數中傳遞。這是我的BL的構造函數。我如何關閉wcf客戶端

private IWCFClient wcfClient; 

    public MyBL() 
     :this(new WCFClient()) 
    { 

    } 

    public MyBL(IWCFClient wcfClient) 
    { 
     serviceClient = wcfClient; 
    } 

因爲我宣佈我的wcfClient作爲接口,我沒有得到.Close()方法。我不得不將它關閉爲((RealwCFClient)wcfClient).Close();

有沒有一種方法可以關閉我的客戶端,而不需要進行類型轉換?我應該在我的界面中公開一個Close方法嗎?

回答

2

將您的對象投射到ICommunicationObject然後.Close()它。

注意,Close()方法可以拋出一個異常,在這種情況下,捕捉它,做.Abort()

0

只要IWCFClient的所有具體實施者將有一個Close()方法,然後將Close()方法添加到接口。

+0

和我該怎麼關閉該方法? IChannel? – Asdfg

+0

@Asdfg - 無論你現在什麼時候投入具體類型,都要關閉它。 –

+0

public void Close(){((IChannel)this).Close(); }。它是否正確? – Asdfg

1

除了其他的答案,你也應該考慮creating a reusable WCF service client。在這個可重用的客戶端中,你可以處理開放和關閉,而不是讓消費類擔心它。

+0

該代碼不能編譯。我確實添加了動態城堡代理引用。 – Asdfg

+0

你使用NuGet包嗎?如果沒有,使用Castle.DynamicProxy NuGet包來確保你擁有所有的依賴關係(比如Castle.Core)。 – BrandonZeider

+0

是的。 Castle.Core在參考中。錯誤不是Reference的bcz。它在代碼中。 – Asdfg

1

您可以爲您的類實現IDisposable,並在您的Dispose方法中關閉WCF服務實例。

public class Consumer 
{ 
    public void SomeMethod() 
    { 
     using (WCFClient client = new WCFClient(new WCFService())) 
     { 
      int sum = client.Add(5, 10); 
     } 
    } 
} 

public class WCFClient : IDisposable 
{ 
    private WCFService _service; 

    public WCFClient(WCFService service) 
    { 
     _service = service; 
    } 

    public int Add(int a, int b) 
    { 
     return _service.Add(a, b); 
    } 

    public void Dispose() 
    { 
     if (_service != null) 
      _service.Close(); 
    } 
} 

在消費者的someMethod()方法的使用塊將確保WCFClient的Dispose方法將被調用關閉該服務的連接。