我对WCF没有经验,我也无法弄清楚一种无痛的方式来模拟WCF服务。WCF和嘲讽
的情况:客户端和服务器都可以访问的接口定义服务,像这样:
public interface ICustomerService
{
[OperationContract]
Customer GetCustomer(int id);
}
现在,我的第一个问题,为什么你会不想做,如果有一个理由客户端和服务器共享共享库中定义服务的相同接口类型。当然,如果服务的消费者不是.NET,或者如果您将它暴露给没有该库的第三方,但我在为时共享这种可能性,伤害了其他场景,对吧?其次,如果这不是一个坏主意,我该如何真正让Visual Studio重用服务接口?我设法通过检查Re-use types
来共享Customer
类型,这也是在共享程序集中定义的,但它仍然会重新生成该接口。
但是,不管这些问题,我如何让客户端可以嘲笑?如果我通过VS生成的服务引用,我得到一个具体的类型来处理,但我不希望我的代码直接引用该类型,我想谈谈一个接口。如果我将生成的客户端公开为ICustomerService
,这可行,我没有Close
方法,因为接口没有定义它。
我还以为下面的办法和完全放弃自动生成客户端和只写客户自己当成是微不足道:
public interface IServiceClient<T>
{
void Close();
T Services { get; }
}
public class CustomerServiceClient : ClientBase<ICustomerService>, ICustomerService, IServiceClient<ICustomerService>
{
public Customer GetCustomer(int id)
{
return base.Channel.GetCustomer(id);
}
public ICustomerService Services
{
get { return this; }
}
}
这工作,我可以公开为IServiceClient<ICustomerService>
我IoC容器,但要注意的是现在是client.Services.GetCustomer(1)
,并且当ICustomerService
界面更改时,我已经失去了轻松重新生成客户端的好处。这是微不足道的代码添加,但可能仍然很烦人,以保持这一点。
另一种可能性是利用生成的类为partial
的事实。它也适用于我这样做:
interface ICloseable
{
void Close();
}
interface ClientInterface : ICustomerService, ICloseable
{
}
partial class CustomerServiceClient : IClientInterface
{
}
但是,这造成了一个虚假的类和接口,这不是一场灾难,但不是很漂亮。
在我走下任一条路线之前,有没有什么明显的我忽略了?
这里有一个非常类似的问题:http://stackoverflow.com/questions/4030475/integration-testing-web-services-against-a-testing-database – 2010-11-02 07:03:23