2010-09-08 54 views
0

平時我有客戶端代碼類同是這樣的:測試IDisposable接口和WCF客戶

// SomeOtherServiceClient would be injected in actual code. 
ISomeOtherService client = new SomeOtherServiceClient(); 

......這樣我可以用於測試的模擬服務。但是現在我有一個WCF服務,其環境模式設置爲PerSession並實現IDisposable

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class SampleService : ISampleService, IDisposable 
{ 
    public void SampleMethod() { ... } 
    public void Dispose() { ... } 
} 

如果我希望把這些客戶端using語句中,有對我來說還是一種方式來嘲笑客戶端進行測試?

// SampleServiceClient would be injected in actual code. 
using (var client = new SampleServiceClient()) 
{ 
    ... 
} 
+0

Juval Lowy明確建議不要使用proxys上的using語句。在有傳輸會話的情況下,任何服務端預期都會使通道出現故障。嘗試在通道出現故障時分配代理將拋出CommunicationObjectFaultedException。 – 2010-09-09 03:51:34

回答

1

如果我理解這個問題,它是ISomeOtherService是一個WCF服務合同,並沒有實現IDisposable即使所有執行客戶端將。你可以通過改變using語句來解決這個問題:

public void SampleMethod() 
{ 
    //client was injected somehow 
    using(this.client as IDisposable) 
    { 
     ... 
    } 
} 
+0

這並不能解決上面Andrew提到的問題,dispose方法會在故障通道上拋出異常。使用Juval的方法安全關閉代理。 – MetalLemon 2010-09-09 15:15:10