我正在嘗試抽象/封裝以下代碼,以便所有客戶端調用都不需要重複此代碼。例如,這是一個電話,從一個視圖模型(MVVM)到WCF服務:Tricky IDisposable問題
using (var channelFactory = new WcfChannelFactory<IPrestoService>(new NetTcpBinding()))
{
var endpointAddress = ConfigurationManager.AppSettings["prestoServiceAddress"];
IPrestoService prestoService = channelFactory.CreateChannel(new EndpointAddress(endpointAddress));
this.Applications = new ObservableCollection<Application>(prestoService.GetAllApplications().ToList());
}
我在重構原始嘗試是要做到這一點:
public static class PrestoWcf
{
public static IPrestoService PrestoService
{
get
{
using (var channelFactory = new WcfChannelFactory<IPrestoService>(new NetTcpBinding()))
{
var endpointAddress = ConfigurationManager.AppSettings["prestoServiceAddress"];
return channelFactory.CreateChannel(new EndpointAddress(endpointAddress));
}
}
}
}
這使得我的觀點模型撥打電話只有一個,現在的代碼行:
this.Applications = new ObservableCollection<Application>(PrestoWcf.PrestoService.GetAllApplications().ToList());
但是,我得到了WcfChannelFactory
已經配置錯誤。這是有道理的,因爲當視圖模型嘗試使用它時,它確實被放棄了。但是,如果我刪除了using
,那麼我沒有正確處理WcfChannelFactory
。請注意,當CreateChannel()
被調用時,WcfChannelFactory
嵌入WcfClientProxy
中。這就是爲什麼視圖模型在處理完成後試圖使用它的原因。
如何抽象此代碼,以保持我的視圖模型調用盡可能簡單,同時正確處理WcfChannelFactory
?我希望我解釋得很好。
編輯 - 已解決!
基於牛排答案,這做到了:
public static class PrestoWcf
{
public static T Invoke<T>(Func<IPrestoService, T> func)
{
using (var channelFactory = new WcfChannelFactory<IPrestoService>(new NetTcpBinding()))
{
var endpointAddress = ConfigurationManager.AppSettings["prestoServiceAddress"];
IPrestoService prestoService = channelFactory.CreateChannel(new EndpointAddress(endpointAddress));
return func(prestoService);
}
}
}
這裏是視圖模型電話:
this.Applications = new ObservableCollection<Application>(PrestoWcf.Invoke(service => service.GetAllApplications()).ToList());
+1使用Func返回您的應用程序,而不是帶有副作用的操作! – 2013-05-06 02:54:03