2011-06-29 15 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();

タイプキャストせずにクライアントを閉じる方法はありますか?私は私のインターフェイスで閉じるメソッドを公開する必要がありますか?

答えて

2

オブジェクトをICommunicationObjectにキャストしてから閉じます()。閉じる().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

そのコードはコンパイルされません。 Dynamic Castleのプロキシリファレンスを追加しました。 – Asdfg

+0

NuGetパッケージを使用しましたか?そうでない場合は、Castle.DynamicProxy NuGetパッケージを使用して、すべての依存関係(Castle.Coreなど)があることを確認します。 – BrandonZeider

+0

はい。 Castle.Coreは参考になっています。エラーは参照の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メソッドは、サービスへの接続を閉じると呼ばれることを保証します。

1

ここに MSDN doc concerning closing a clientへのリンクです。

一般的に言って処分/クローズが、私はこの機能をencapsuates拡張メソッドを使用して例外をスローすることが期待されていない、ここではかなり良い article providing the basic conceptです。

私は動詞が気に入っています。使用法は、使用法とは対照的にメソッド名を使用または実行します。使用法は、ほとんどの人が例外を期待しないdisposeを呼び出すことを意味します。

関連する問題