詬病WCF之一,對已知型別的支援比較弱智(WCF面向介面程式設計)
之所以這樣說是因為如果我們要開發面向藉口程式設計的服務的話,那麼你就比較倒黴了。無論是WCF固有的KnownType特性還是ServiceKnownType,你都會遇到這樣那樣的困難。
如果我們使用KnownType,那麼我們得在父類中無休止的聲名出子類來。每增加一個子類就得在父類中標記一下。這種方法顯然違反了物件導向的原則。
如果使用ServiceKnownType,那就得配置一些東西來標明我們的型別,但是成功的機率小的可憐。
舉個例子:
如果按這樣把服務釋出出去後,客戶端得到的代理類的方法void Add(Object data);
當我們在客戶端實現了IData,自定義自己的資料類的時候就會出錯,比如:
namespace DataLib
{
[DataContract]
[Serializable]
public class MyData:IData
{
[DataMember]
public string Name;
[DataMember]
public int ID;
IData 成員
}
}當我們把MyData的型別向伺服器傳輸的時候就會報出序列化出錯之類的錯誤,我們按照ServiceKnownType進行配置之後也達不到預想的效果,KnownType又不符合物件導向的方法。
那該怎麼辦?
既然WCF不知道如何序列化我們的MyData類,那我們就幫它序列化好了,那麼我們需要改造一下伺服器端的程式碼,改完之後如下:
改造後的服務實現類:
namespace Lib
{
public class MyService:IMyService
{
IMyService 成員
}
}
改造後的MyData:
namespace DataLib
{
[Serializable]
public class MyData:IData
{
public string Name{Get;Set;}
public int ID{Get;Set;}
IData 成員
}
}這樣,客戶端在向伺服器傳輸MyData型別的引數的時候已經是byte[] data的了,也就是我們得自己把我們的data序列化成byte[],傳輸的伺服器上,然後在伺服器上反序列化得到我們的
MyData,當然這個MyData是IData型別的,那麼我們就可以呼叫IData的Save()方法了,這樣就實現了,面向藉口程式設計了。
當然得把我們的MyData所在的類庫生成的dll拷貝到伺服器一份,不用加任何配置,一定要保證這個dll和客戶端的版本始終一樣。
這是我暫時想到的思路,希望會對大家有所幫助。
如果我們使用KnownType,那麼我們得在父類中無休止的聲名出子類來。每增加一個子類就得在父類中標記一下。這種方法顯然違反了物件導向的原則。
如果使用ServiceKnownType,那就得配置一些東西來標明我們的型別,但是成功的機率小的可憐。
舉個例子:
我們的藉口型別:
namespace Lib
{
public interface IData
{
void Save();
}
}
namespace Lib
{
public interface IData
{
void Save();
}
}
我們的服務契約
namespace Lib
{
[ServiceContract]
public interface IMyService
{
[OperationContract()]
void Add(IData data);
}
}
namespace Lib
{
[ServiceContract]
public interface IMyService
{
[OperationContract()]
void Add(IData data);
}
}
我們的服務實現類:
namespace Lib
{
public class MyService:IMyService
{
IMyService 成員
}
}
namespace Lib
{
public class MyService:IMyService
{
IMyService 成員
}
}
如果按這樣把服務釋出出去後,客戶端得到的代理類的方法void Add(Object data);
當我們在客戶端實現了IData,自定義自己的資料類的時候就會出錯,比如:
namespace DataLib
{
[DataContract]
[Serializable]
public class MyData:IData
{
[DataMember]
public string Name;
[DataMember]
public int ID;
IData 成員
}
}
那該怎麼辦?
既然WCF不知道如何序列化我們的MyData類,那我們就幫它序列化好了,那麼我們需要改造一下伺服器端的程式碼,改完之後如下:
改造後的服務契約
namespace Lib
{
[ServiceContract]
public interface IMyService
{
[OperationContract()]
void Add(byte[] data);
}
}
namespace Lib
{
[ServiceContract]
public interface IMyService
{
[OperationContract()]
void Add(byte[] data);
}
}
改造後的服務實現類:
namespace Lib
{
public class MyService:IMyService
{
IMyService 成員
}
}
改造後的MyData:
namespace DataLib
{
[Serializable]
public class MyData:IData
{
public string Name{Get;Set;}
public int ID{Get;Set;}
IData 成員
}
}
MyData,當然這個MyData是IData型別的,那麼我們就可以呼叫IData的Save()方法了,這樣就實現了,面向藉口程式設計了。
當然得把我們的MyData所在的類庫生成的dll拷貝到伺服器一份,不用加任何配置,一定要保證這個dll和客戶端的版本始終一樣。
這是我暫時想到的思路,希望會對大家有所幫助。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-609982/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WCF、Socket程式設計程式設計
- WCF與ASP.NET Core效能比較ASP.NET
- WCF除錯異常資訊:ServiceHost 僅支援類服務型別除錯型別
- WCF、Web API、WCF REST、Web Service之區別WebAPIREST
- WCF分散式開發步步為贏(14):WCF安全程式設計–基本概念分散式程式設計
- WCF服務端的.NET Core支援專案Core WCF 正式啟動服務端
- 學習 WCF (3)--開發WCF客戶程式
- WCF服務程式設計設計規範(7):WCF最佳實踐《WCFBestPractice》資料下載與翻譯程式設計
- 面向介面程式設計程式設計
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- C#動態呼叫WCF介面C#
- CoreWCF 1.0.0 釋出,微軟正式支援WCF微軟
- Java 支援的資料型別與 MySQL 支援的資料型別對比Java資料型別MySql
- MSMQ In WCFMQ
- WCF學習筆記(一):WCF簡介筆記
- wcf 配置與程式碼建立
- 面向介面的程式設計+MVC程式設計MVC
- 面向介面程式設計把握不好程式設計
- WCF、WebAPI、WCFREST、WebService之間的區別WebAPIREST
- UI設計比較流行的插畫型別和運用UI型別
- Js比較對Object型別進行排序JSObject型別排序
- WCF筆記筆記
- WCF基礎
- WCF Rest ServiceREST
- 十五天精通WCF——第十一天 如何對wcf進行全程監控
- WCF 設計和實現服務協定(01)
- php型別比較表PHP型別
- Java Integer型別比較Java型別
- 程式設計師在程式設計中遇到的奇葩弱智問題程式設計師
- Oracle date 型別比較和String比較Oracle型別
- java double、float型別的比較Java型別
- C與I型別的比較型別
- WCF Security:Silverlight authentication for WCF service based on security token
- WCF 找不到型別“WcfServiceStudy.WcfService”,它在 ServiceHost 指令中提供為 Servi型別
- WCF系列教程地址
- WCF配置檔案
- WCF 服務應用程式與 服務庫之間的區別
- WCF基礎教程之開篇:建立、測試和呼叫WCF