你很近。首先,你不應該改變Reference.vb
文件,因爲當服務定義得到更新時它將被覆蓋,並且改變該文件不是一個好習慣。
您可以改爲使用Proxy Pattern。代理將用於調用服務中的方法並管理連接狀態等。我將用C#編寫,因爲我不知道VB,但你會明白。我會盡可能簡化這一點。
Proxy類的接口可能是這樣的:
public interface IProxy
{
/// <summary>
/// Execute call to service method
/// </summary>
/// <typeparam name="TBusiness">Service interface</typeparam>
/// <typeparam name="TResult">Service method return type</typeparam>
/// <param name="call">Service method</param>
/// <returns>Returns what service method returns</returns>
TResult Execute<TBusiness, TResult>(Func<TBusiness, TResult> call) where TBusiness : class;
/// <summary>
/// Execute call to void service method
/// </summary>
/// <typeparam name="TBusiness">Service Interface</typeparam>
/// <param name="call">Service method</param>
void Execute<TBusiness>(Action<TBusiness> call) where TBusiness : class;
}
正如你看到的,也有在此界面兩種方法。其中一個將用於調用具有返回類型的服務方法,另一個將用於服務中的無效方法。您也可以將這些方法的非通用版本添加到接口中。
的實現可能是這樣的:
public class ServiceProxy : IProxy
{
protected void ExecuteCall<TContract>(Action<TContract> code) where TContract : class
{
var contractChannel = default(TContract);
try
{
//Create an instance of service client and call the method
contractChannel = Activator.CreateInstance<TContract>();
code(contractChannel);
((ICommunicationObject)contractChannel).Close();
}
catch (FaultException)
{
((ICommunicationObject)contractChannel).Abort();
}
catch (CommunicationException)
{
((ICommunicationObject)contractChannel).Abort();
}
catch (TimeoutException)
{
((ICommunicationObject)contractChannel).Abort();
}
}
public TResult Execute<TContract, TResult>(Func<TContract, TResult> call) where TContract : class
{
return ExecuteCall(call);
}
public void Execute<TContract>(Action<TContract> call) where TContract : class
{
ExecuteCall(call);
}
}
然後,您可以使用它像這樣:
var proxy = new ServiceProxy();
proxy.Execute<Service1Client>(a => a.MethodInTheService());
什麼是偉大的這個方法,你如何能做到盡善盡美是:
- 您可能不想將代理創建爲
new ServiceProxy()
但是injectIProxy
作爲ServiceProxy
,並且現在將它用作WCF客戶端,但是如果它將來改變爲Web API,例如實現並注入WebApiProxy
。
- 您可以使用合約接口來調用代理方法。
- 你可以做任何你想要的代理類像緩存渠道,從數據庫等
這看起來像一個很好的解決方案,我儘管如此,我還是需要一些時間來實施。 C#已經足夠接近了! – cjw