我對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