我尝试写一些代码,以帮助单元测试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