我嘗試寫一些代碼,以幫助單元測試WCF服務。這些服務通過創建代理實例的Facade類訪問,然後調用代理方法並返回結果;爲每個代理方法。我希望能夠用創建真實服務或虛假服務的東西替換當前的創建代碼。泛型約束與傳承
我不能得到那個工作。我煮它歸結爲以下幾點:
using System.ServiceModel;
namespace ExpressionTrees
{
public interface IMyContract
{
void Method();
}
public class MyClient : ClientBase<IMyContract>, IMyContract
{
public MyClient()
{
}
public MyClient(string endpointConfigurationName)
: base(endpointConfigurationName)
{
}
public void Method()
{
Channel.Method();
}
}
public class Test
{
public TClient MakeClient<TClient>()
where TClient : ClientBase<IMyContract>, IMyContract, new()
{
return new MyClient("config");
// Error:
// Cannot convert expression of type 'ExpressionTrees.ServiceClient' to return type 'TClient'
}
}
}
爲什麼說,即使MyClient
類從ClientBase<IMyContract>
派生並實現IMyContract
,我不能想回一個TClient
的方法返回一個MyClient
實例? TClient
指定了一個類型約束,我認爲這意味着同樣的事情。
我的目標是調用代碼:
public void CallClient<TClient>()
where TClient : ClientBase<IMyContract>, IMyContract
{
TClient client = null;
bool success = false;
try
{
client = MakeClient<TClient>();
client.Method();
client.Close();
success = true;
}
finally
{
if (!success && client != null)
{
client.Abort();
}
}
}
但不是始終在呼喚MakeClient<TClient>
,我希望能夠有一個單元測試注入模擬對象。由於上面的代碼取決於ClientBase<IMyContract>
,IMyContract
,所以我似乎在試圖「合成」一個能夠滿足這個約束的泛型類。
現在回想起來,這是沒有意義的。作爲一個例子,所述ClientBase<IMyContract>
會期望在一個Channel
對象將被構造,它可以然後委託Close
方法這樣的方式來進行實例化。
我已經結束了撐船具有完全相同的代碼運行無論對於真實和虛假服務。我現在正在注入一個IMyService
,並調用IMyService.Method
或client.Method
,具體取決於我的注入屬性是否爲空。
我仍然無法想象爲什麼這個問題吸引了downvotes。我希望其中一位下臺者會告訴我,以便我可以改進這個問題。 – 2013-12-21 01:59:28