WCF數(shù)據(jù)表基本概念解讀
在WCF開(kāi)發(fā)工具中,我們可以通過(guò)對(duì)此的應(yīng)用來(lái)獲得一些技術(shù)上的幫助,從而輕松的完成各種功能需求。今天我們就先來(lái)看看WCF數(shù)據(jù)表的相關(guān)概念。DataSet以及WCF數(shù)據(jù)表類型是可序列化的,因而我們可以在服務(wù)契約中接收或返回?cái)?shù)據(jù)表或數(shù)據(jù)集。
如果服務(wù)契約使用了DataSet和DataTable類型,生成的代理文件不會(huì)直接使用DataSet和DataTable類型,而是包含DataTable數(shù)據(jù)契約的定義(只包含DataTable的樣式,而不包含任何代碼)。但我們可以手工修改這些定義。例如這樣的服務(wù)契約:
- [ServiceContract()]
- public interface IContactManager {
- [OperationContract]
- void AddContact(Contact contact);
- [OperationContract]
- void AddContacts(DataTable contacts);
- [OperationContract]
- DataTable GetContacts(); }
那么生成的代理文件可能會(huì)是這樣:
- public interface IContactManager {
- [System.ServiceModel.OperationContractAttribute(
Action="http://tempuri.org/IContactManager/AddContact",
ReplyAction="http://tempuri.org/IContactManager/AddContactResponse")]- [System.ServiceModel.XmlSerializerFormatAttribute()]
- void AddContact(Contact contact);
- [System.ServiceModel.OperationContractAttribute(
Action="http://tempuri.org/IContactManager/AddContacts",
ReplyAction="http://tempuri.org/IContactManager/AddContactsResponse")]- [System.ServiceModel.XmlSerializerFormatAttribute()]
- AddContactsResponse AddContacts(AddContactsRequest request);
- [System.ServiceModel.OperationContractAttribute(
Action="http://tempuri.org/IContactManager/GetContacts",
ReplyAction="http://tempuri.org/IContactManager/GetContactsResponse")]- [System.ServiceModel.XmlSerializerFormatAttribute()]
- GetContactsResponse GetContacts(GetContactsRequest request); }
代理類的定義則如下所示:
- [System.Diagnostics.DebuggerStepThroughAttribute()]
- [System.CodeDom.Compiler.GeneratedCodeAttribute
("System.ServiceModel", "3.0.0.0")]- public partial class ContactManagerClient :
System.ServiceModel.ClientBase<IContactManager>,- IContactManager { //其余成員略;
- public void AddContact(Contact contact)
{ base.Channel.AddContact(contact);- }
- AddContactsResponse IContactManager.AddContacts
(AddContactsRequest request) {- return base.Channel.AddContacts(request); }
- public void AddContacts(AddContactsContacts contacts) {
- AddContactsRequest inValue = new AddContactsRequest();
- inValue.contacts = contacts;
- AddContactsResponse retVal = ((IContactManager)(this)).
AddContacts(inValue); }- GetContactsResponse IContactManager.GetContacts
(GetContactsRequest request) {- return base.Channel.GetContacts(request); }
- public GetContactsResponseGetContactsResult GetContacts() {
- GetContactsRequest inValue = new GetContactsRequest();
- GetContactsResponse retVal = ((IContactManager)(this)).
GetContacts(inValue);- return retVal.GetContactsResult; } }
我們可以手動(dòng)將AddContacts()與GetContacts()方法修改為:
- public void AddContacts(DataTable contacts) {
- AddContactsRequest inValue = new AddContactsRequest();
- inValue.contacts = contacts;
- AddContactsResponse retVal = ((IContactManager)(this)).
AddContacts(inValue); }- public DataTable GetContacts() {
- GetContactsRequest inValue = new GetContactsRequest();
- GetContactsResponse retVal = ((IContactManager)(this)).
GetContacts(inValue);- return retVal.GetContactsResult; }
當(dāng)然,前提條件是我們需要修改AddContactRequest類以及GetContactsResponse,例如將AddContactRequest類的contacts成員由原來(lái)的AddContactsContacts類型修改為DataTable類型;將GetContactsResponse中的GetContactsResult成員由原來(lái)的GetContactsResponseGetContactsResult類型修改為WCF數(shù)據(jù)表類型。
自動(dòng)生成的代理類非常復(fù)雜,實(shí)際上我們完全可以簡(jiǎn)化。首先將客戶端的服務(wù)契約定義修改為與服務(wù)端服務(wù)契約完全一致的定義:
- [ServiceContract()]
- public interface IContactManager {
- [OperationContract]
- void AddContact(Contact contact);
- [OperationContract]
- void AddContacts(DataTable contacts);
- [OperationContract] DataTable GetContacts(); }
然后修改代理類ContactManagerClient:
- public partial class ContactManagerClient : System.ServiceModel.
ClientBase<IContactManager>,- IContactManager {
- public void AddContact(Contact contact) { base.Channel.
AddContact(contact); }- public void AddContacts(DataTable contacts)
{ base.Channel.AddContacts(contacts); }- public DataTable GetContacts() {
- return base.Channel.GetContacts();
- } }
以上就是對(duì)WCF數(shù)據(jù)表類型的相關(guān)概念。
【編輯推薦】