2010-07-12 56 views
1

在工作中,我找到了一個幫助程序類來管理WCF服務,該服務實現了IDisposable並具有一個派生自System.ServiceModel.ClientBase的ServiceAgent。 Dispose()方法關閉所有打開的WCF服務。該幫助器公開了將調用包裝到ServiceAgent的方法中的方法。每種方法都建立在該模式上:IDisposable和WCF

public void WCFMethod1() 
{ 
    using(this) 
    { 
     this.ServiceAgent.WCFMethod1(); 
    } 
} 

public override void Dispose() 
{ 
    try 
    { 
     this.ServiceAgent.Close(); 
    } 
    catch 
    { 
     this.ServiceAgent.Abort(); 
    } 
    finally 
    { 
     this.ServiceAgent = null; 
    } 
} 

下面是問題:使用(這)一個良好的做法?

+0

它是解決WCF錯誤/錯誤代碼的解決方法。閱讀更多在http://geekswithblogs.net/bcaraway/archive/2008/07/06/123622.aspx – Rohit 2011-03-21 09:06:49

+0

不,它不是一個工作的實施。 * Dispose()*應該清理「* WCFMethod *」類並且不關閉服務。正如安德烈和帕維爾所說,這種做法令人困惑。當「* Dispose()*」被調用時,我不希望再使用這個對象,因爲它應該被丟棄(根據定義,它可以隨時由GC清理) – 2011-07-12 08:27:07

回答

1

我不喜歡它。我認爲這個類應該是a)一次b)用實例化它的代碼來處理。 IDisposable通常理解爲實現RAII模式的方式。 MSDN明確規定:

如果對象的Dispose方法是 稱爲不止一次,對象必須 忽略第一個之後的所有呼叫。 如果其Dispose方法多次調用 ,則該對象不得拋出異常 。其他 實例方法比Dispose可以拋出 ObjectDisposedException當資源 已被處置。

所以用戶會發現這種行爲令人費解,所以我建議,使其每次呼叫實例化設計類:

using (var clientFactory = new ClientFactory()) 
    clientFactory.Client.WCFMethod1(); 
1

可以肯定這個代碼是一個不好的做法。決定實例是否需要的是調用者。據推測,在調用Dispose方法後,不允許再有方法調用(根據指導方針,實例會切換到處置狀態)。想象一下你調用一些方法,然後調用另一個方法並獲得ObjectDisposed異常。有點奇怪,不是嗎?