服务端对WCF数据举例说明
创始人
2024-06-14 07:11:12
0

到这里服务端的代码就全部列举出来了。当然本文中介绍的是元数据同步,而相应的SyncProvider实现是
通过MySimpleSyncProvider.cs文件提供的, #t#

当然为了不让我的某些错误理解影响大家阅读源码,这里直接将相应的英文注释也放在这里。 publicclassMySyncProvider:KnowledgeSyncProvider,IChangeDataRetriever,INotifyingChangeApplierTarget  

  1. {  
  2. //Thenameofthemetadatastorecustomcolumnthatisusedtosaveatimestampoflastchangeonan  
  3. //iteminthemetadatastoresowecandochangedetection.  
  4. conststringTIMESTAMP_COLUMNNAME="timestamp";  
  5. //Thisisoursampleinmemorydatastorewhichforsimplicty,storessetsofstringname-ProcessChangeBatchpairs  
  6. //referencedbyidentifiersofthetype'Guid'  
  7. MySimpleDataStore_store;  
  8. //UsetheSyncFramework'soptionalmetadatastoretotrackversioninformation  
  9. SqlMetadataStore_metadataStore=null;//表示通过使用轻型数据库存储元数据来实现的元数据存储区。  
  10. ReplicaMetadata_metadata=null;//提供对元数据存储区中的副本元数据和项元数据的访问。ReplicaMetadata还对删除检测和用于实现同步提供程序方法的帮助器提供服务  
  11. privatestring_name=null;  
  12. privatestring_folderPath=null;  
  13. privatestring_replicaMetadataFile=null;  
  14. privatestring_replicaIdFile=null;  
  15. //Theprovider'suniqueidentifier  
  16. SyncId_replicaId=null;  
  17. SyncIdFormatGroup_idFormats=null;  
  18. SyncSessionContext_currentSessionContext=null;  
  19. //Constructadatastorebyprovidinganamefortheendpoint(replica)and  
  20. //afiletowhichwe'llpersistthesyncmetadata(file)  
  21. publicMySyncProvider(stringfolderPath,stringname)  
  22. {  
  23. namename=name;  
  24. folderPathfolderPath=folderPath;  
  25. replicaMetadataFile=_folderPath.ToString()+""+_name.ToString()+".Metadata";  
  26. replicaIdFile=_folderPath.ToString()+""+_name.ToString()+".Replicaid";  
  27. SetItemIdFormatandReplicaIdFormatforusingGuidids.  
  28. idFormats=newSyncIdFormatGroup();  
  29. idFormats.ItemIdFormat.IsVariableLength=false;  
  30. idFormats.ItemIdFormat.Length=16;  
  31. idFormats.ReplicaIdFormat.IsVariableLength=false;  
  32. idFormats.ReplicaIdFormat.Length=16;  
  33. }  
  34. publicSyncIdReplicaId  
  35. {  
  36. get  
  37. {  
  38. if(_replicaId==null)  
  39. {  
  40. replicaId=GetReplicaIdFromFile(_replicaIdFile);  
  41. }  
  42. return_replicaId;  
  43. }  
  44. }  
  45. #regionMetadataStoreRelatedMethods  
  46. privatevoidInitializeMetadataStore()  
  47. {  
  48. Valuesforaddingacustomfieldtothemetadatastore  
  49. Listfields=newList();  
  50. SyncIdid=ReplicaId;  
  51. Createoropenthemetadatastore,initializingitwiththeidformatswe'llusetoreferenceouritemsandendpoints  
  52. if(!File.Exists(_replicaMetadataFile))  
  53. {  
  54. fields.Add(newFieldSchema(TIMESTAMP_COLUMNNAME,typeof(System.UInt64)));  
  55. //创建一个具有指定名称和位置的元数据存储区文件,然后返回表示该文件的元数据存储区对象。  
  56. _metadataStore=SqlMetadataStore.CreateStore(_replicaMetadataFile);  
  57. //在元数据存储区创建和初始化副本的元数据,并返回一个用于访问该副本元数据的副本元数据对象。  
  58. _metadata=_metadataStore.InitializeReplicaMetadata(_idFormats,//提供程序的ID格式架构  
  59. replicaId,//与此元数据相关联的副本ID  
  60. fields,//每个元数据项的自定义元数据字段的架构信息集合。如果不存在自定义元数据字段,则可为null引用  
  61. null/*Noindexestocreate*/);//可用于更有效地查找元数据存储区中的项的索引架构列表。如果不存在自定义索引,则可以是null引用  
  62. }  
  63. else  
  64. {  
  65. _metadataStore=SqlMetadataStore.OpenStore(_replicaMetadataFile);//打开现有的元数据存储区文件,并返回表示该文件的元数据存储区对象  
  66. _metadata=_metadataStore.GetReplicaMetadata(_idFormats,_replicaId);//获取用于访问元数据存储区中的副本元数据的副本元数据对象。  
  67. }  
  68. }  
  69. privatevoidCloseMetadataStore()  
  70. {  
  71. metadataStore.Dispose();  
  72. metadataStore=null;  
  73. }  
  74. //Updatethemetadatastorewithchangesthathaveoccuredonthedatastoresincethelasttimeitwasupdated.  
  75. publicvoidUpdateMetadataStoreWithLocalChanges()  
  76. {  
  77. SyncVersionnewVersion=newSyncVersion(0,_metadata.GetNextTickCount());  
  78. metadata.DeleteDetector.MarkAllItemsUnreported();  
  79. foreach(Guididin_store.Ids)  
  80. {  
  81. ItemDatadata=_store.Get(id);  
  82. ItemMetadataitem=null;  
  83. //Lookupanitem'smetadatabyitsID  
  84. item=_metadata.FindItemMetadataById(newSyncId(id));  
  85. if(null==item)  
  86. {  
  87. Newitem,musthavebeencreatedsincethatlasttimethemetadatawasupdated.  
  88. Createtheitemmetadatarequiredforsync(givingitaSyncIDandaversion,definedtobeaDWORDandaULONGLONG  
  89. Forcreates,simplyprovidetherelativereplicaID(0)andthetickcountfortheprovider(everincreasing)  
  90. item=_metadata.CreateItemMetadata(newSyncId(id),newVersion);  
  91. item.ChangeVersion=newVersion;  
  92. SaveItemMetadata(item,data.TimeStamp);  
  93. }  
  94. else  
  95. {  
  96. if(data.TimeStamp>item.GetUInt64Field(TIMESTAMP_COLUMNNAME))//theitemhaschangedsincethelastsyncoperation.  
  97. {  
  98. //ChangedItem,thisitemhaschangedsincethelasttimethemetadatawasupdated.  
  99. //Assignanewversionbysimplystating"who"modifiedthisitem(0=local/me)and"when"(tickcountforthestore)  
  100. item.ChangeVersion=newVersion;  
  101. SaveItemMetadata(item,data.TimeStamp);  
  102. }  
  103. else  
  104. {  
  105. //Unchangeditem,nothinghaschangessojustmarkitaslivesothatthemetadataknowsithasnotbeendeleted.  
  106. _metadata.DeleteDetector.ReportLiveItemById(newSyncId(id));  
  107. }  
  108. }  
  109. }  
  110. Nowgobackthroughtheitemsthatarenolongerinthestoreandmarkthemasdeletedinthemetadata.   
  111. Thissetstheitemasatombstone.  
  112. foreach(ItemMetadataitemin_metadata.DeleteDetector.FindUnreportedItems())  
  113. {  
  114. item.MarkAsDeleted(newVersion);  
  115. SaveItemMetadata(item,0);//settimestampto0fortombstones  
  116. }  
  117. }  
  118. privatevoidSaveItemMetadata(ItemMetadataitem,ulongtimeStamp)  
  119. {  
  120. item.SetCustomField(TIMESTAMP_COLUMNNAME,timeStamp);  
  121. SaveItemMetadata(item);  
  122. }  
  123. privatevoidSaveItemMetadata(ItemMetadataitem)  
  124. {  
  125. metadata.SaveItemMetadata(item);  
  126. }  
  127. //MethodforcleaninguptombstonesolderthanacertainTimeSpan  
  128. publicvoidCleanupTombstones(TimeSpantimespan)  
  129. {  
  130. InitializeMetadataStore();  
  131. metadataStore.BeginTransaction();//对元数据存储区启动显式事务  
  132. metadata.CleanupDeletedItems(timespan);  
  133. metadataStore.CommitTransaction();//提交已对元数据存储区启动的显式事务  
  134. CloseMetadataStore();  
  135. }  
  136. #endregionMetadataStoreRelatedMethods  
  137. #regionKnowledgeSyncProviderOverrides  
  138. //BeginSessioniscalledatthebeginningofeachsyncoperation. Doinitializationhere. Forexampleupdate  
  139. //metadataifitwasnotupdatedastheactualdatawaschanged.  
  140. publicoverridevoidBeginSession(SyncProviderPositionposition,SyncSessionContextsyncSessionContext)  
  141. {  
  142. BeginSession();  
  143. currentSessionContext=syncSessionContext;  
  144. }  
  145. //EndSessioniscalledafterthesyncoperationiscompleted. Cleanuphappenshere.  
  146. publicoverridevoidEndSession(SyncSessionContextsyncSessionContext)  
  147. {  
  148. EndSession();  
  149. }  
  150. //Simplyaskthemetadatastoretocomputemychangebatchforme,providingthebatchsizeandtheknowledgeoftheotherendpoint!  
  151. //Theengineisaskingforthelistofchangesthatthedestinationproviderdoesnotknowabout.  
  152. //SyncKnowledge:表示副本所具有的有关自己项存储区的知识。  
  153. //此类型的所有公共静态(在VisualBasic中共享)成员都是线程安全的。不保证任何实例成员的线程安全。  
  154. publicoverrideChangeBatchGetChangeBatch(uintbatchSize,SyncKnowledgedestinationKnowledge,outobjectchangeDataRetriever)  
  155. {  
  156. ChangeBatchbatch=_metadata.GetChangeBatch(batchSize,destinationKnowledge);  
  157. changeDataRetriever=this;//thisiswherethetransfermechanism/protocolwouldgo.Foraninmemoryprovider,thisissufficient  
  158. returnbatch;  
  159. }  
  160. //ThisisonlycalledwhentheenginehasdetectedthatthedestinationisoutofdateduetoTombstonecleanup.  
  161. publicoverrideFullEnumerationChangeBatchGetFullEnumerationChangeBatch(uintbatchSize,SyncIdlowerEnumerationBound,SyncKnowledgeknowledgeForDataRetrieval,outobjectchangeDataRetriever)  
  162. {  
  163. FullEnumerationChangeBatchbatch=_metadata.GetFullEnumerationChangeBatch(batchSize,lowerEnumerationBound,knowledgeForDataRetrieval);  
  164. changeDataRetriever=this;//thisiswherethetransfermechanism/protocolwouldgo.Foraninmemoryprovider,thisissufficient  
  165. returnbatch;  
  166. }  
  167. //指定batchSize为10,以及相应的知识  
  168. publicoverridevoidGetSyncBatchParameters(outuintbatchSize,outSyncKnowledgeknowledge)  
  169. {  
  170. batchSize=10;  
  171. knowledge=_metadata.GetKnowledge();  
  172. }  
  173. //应用修改  
  174. publicoverridevoidProcessChangeBatch(ConflictResolutionPolicyresolutionPolicy,ChangeBatchsourceChanges,  
  175. objectchangeDataRetriever,SyncCallbackssyncCallback,SyncSessionStatisticssessionStatistics)  
  176. {  
  177. metadataStore.BeginTransaction();  
  178. 从原数据存储中获得取得本地所有修改  
  179. IEnumerablelocalChanges=_metadata.GetLocalVersions(sourceChanges);  
  180. Createachangeapplierobjecttomakechangeapplicationeasier(maketheenginecallme  
  181. whenitneedsdataandwhenIshouldsavedata)  
  182. NotifyingChangeApplierchangeApplier=newNotifyingChangeApplier(_idFormats);  
  183. changeApplier.ApplyChanges(resolutionPolicy,sourceChanges,changeDataRetrieverasIChangeDataRetriever,localChanges,_metadata.GetKnowledge(),  
  184. _metadata.GetForgottenKnowledge(),this,_currentSessionContext,syncCallback);  
  185. metadataStore.CommitTransaction();  
  186. }  
  187. //Iffullenumerationisneededbecause thisproviderisoutofdateduetotombstonecleanup,thenthismethodwillbecalledbytheengine.  
  188. publicoverridevoidProcessFullEnumerationChangeBatch(ConflictResolutionPolicyresolutionPolicy,FullEnumerationChangeBatchsourceChanges,objectchangeDataRetriever,SyncCallbackssyncCallback,SyncSessionStatisticssessionStatistics)  
  189. {  
  190. metadataStore.BeginTransaction();  
  191. Getallmylocalchangeversionsfromthemetadatastore  
  192. IEnumerablelocalChanges=_metadata.GetFullEnumerationLocalVersions(sourceChanges);  
  193. Createachangeapplierobjecttomakechangeapplicationeasier(maketheenginecallme  
  194. whenitneedsdataandwhenIshouldsavedata)  
  195. NotifyingChangeApplierchangeApplier=newNotifyingChangeApplier(_idFormats);  
  196. changeApplier.ApplyFullEnumerationChanges(resolutionPolicy,sourceChanges,changeDataRetrieverasIChangeDataRetriever,localChanges,_metadata.GetKnowledge(),  
  197. _metadata.GetForgottenKnowledge(),this,_currentSessionContext,syncCallback);  
  198. metadataStore.CommitTransaction();  

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...