XAF 转换不同应用程序模型
2011-01-13 08:36
609 查看
ConvertApplicationModelDifferences转换不同应用程序模型 |
TheeXpressAppFrameworkisbasedonthemodulesconcept.Asarule,everymoduleimplementsacertainfeature.Entitiesimplementedinamodule,suchas
eXpressApp框架基于模块构成。作为一个规则,每个模块实现一个特定功能。在一个模块中实现实体,如
Basically,ApplicationModeldifferencesareconvertedintwosteps.
基本上,转换应用程序模型差异部分分两步。
TheXafMLfilesstoredinXMLformatcanbeprocessedbyamoduleimplementingthe
XafML文件以XML文件格式存储,能被由实现
Forcomplexconversionscenarios,specialupdatersimplementingthe
复杂的转换,指定更新者实现
Dependingonaparticularscenario,youmayneedtoperformeitherbothofthesestepsorjustone.So,forexample,inonescenarioyoumayneedtoimplementanXMLconverter,sothattheapplicationcouldstart,andanodeupdater,toperformacomplexconversion.Inotherscenarios,youmayneedtoimplementonlyanXMLconverteroranodeupdater.
根据不同情况,你可能需要实现这两个步骤中一个或多个。例如,在一种情况下你可能需要实现一个XML转换,启动应用程序,一个节点更新,实现一个复杂转换。在其他情况下,你可能只需实现一个XML转换或一个节点更新。
ImplementanXMLconverter(实现一个XML转换)
AnXMLconverterisrepresentedbyamoduleimplementingthe
用一个模块实现
该方法使用
SupposeyourapplicationusesamodulewhichaddsanOperatingModestringpropertytotheApplicationModel'sOptionsnode.Thispropertyisdesignedtotakeeithera"Simple"or"Complex"wordasavalue.Originally,themodule
假设你用了一个应用程序给应用程序模型的选项节点添加一个字符串属性OperatingMode的模块,这个属性用“Simple”或“Complex”作为值。最初,这个模块同过以下方式
| ||||||
usingDevExpress.ExpressApp.Model; publicinterfaceIModelMyOptions{ stringOperatingMode{get;set;} } publicsealedpartialclassMyModule:ModuleBase{ //... publicoverridevoidExtendModelInterfaces(ModelInterfaceExtendersextenders){ base.ExtendModelInterfaces(extenders); extenders.Add<IModelOptions,IModelMyOptions>(); } } ImportsDevExpress.ExpressApp.Model PublicInterfaceIModelMyOptions PropertyOperatingMode()AsString EndInterface PublicNotInheritablePartialClassMyModule InheritsModuleBase '... PublicOverridesSubExtendModelInterfaces(ByValextendersAsModelInterfaceExtenders) MyBase.ExtendModelInterfaces(extenders) extenders.Add(OfIModelOptions,IModelMyOptions)() EndSub EndClass |
C# | usingDevExpress.ExpressApp.Model; publicinterfaceIModelMyOptions{ stringOperatingMode{get;set;} } publicsealedpartialclassMyModule:ModuleBase{ //... publicoverridevoidExtendModelInterfaces(ModelInterfaceExtendersextenders){ base.ExtendModelInterfaces(extenders); extenders.Add<IModelOptions,IModelMyOptions>(); } } |
VB | ImportsDevExpress.ExpressApp.Model PublicInterfaceIModelMyOptions PropertyOperatingMode()AsString EndInterface PublicNotInheritablePartialClassMyModule InheritsModuleBase '... PublicOverridesSubExtendModelInterfaces(ByValextendersAsModelInterfaceExtenders) MyBase.ExtendModelInterfaces(extenders) extenders.Add(OfIModelOptions,IModelMyOptions)() EndSub EndClass |
UsersofyourapplicationcustomizethispropertyvalueanditisstoredtotheirApplicationModeldifferences.Then,themoduleisupdatedtoanewversionwhichintroducesacoupleofchanges.First,theOperatingModepropertytypeischangedtoanewlyintroducedenumeration.Second,stringrepresentationsofthenewenumerationvaluesaredifferentfromthepreviouslyusedstringvalues:
应用程序的用户自定义这个属性值并存储到他们的应用程序模型差异。接着,模块更新到新版本改动。首先,OperatingMode属性类型更改为新进的枚举。第二,新的枚举字符串值不同于之前用的字符串值:
| ||||||
publicinterfaceIModelMyOptions{ OperatingModeOperatingMode{get;set;} } publicenumOperatingMode{Basic,Advanced} PublicInterfaceIModelMyOptions PropertyOperatingMode()AsOperatingMode EndInterface PublicEnumOperatingMode Basic Advanced EndEnum |
C# | publicinterfaceIModelMyOptions{ OperatingModeOperatingMode{get;set;} } publicenumOperatingMode{Basic,Advanced} |
VB | PublicInterfaceIModelMyOptions PropertyOperatingMode()AsOperatingMode EndInterface PublicEnumOperatingMode Basic Advanced EndEnum |
Ifyounowrecompiletheapplicationwiththeupdatedmoduleandredistributeit,existinguserswillnotbeabletousetheapplication.Attheapplicationstart,amessagewillbedisplayedstatingthatanerrorhasoccurredwhileloadingtheApplicationModeldifferences.Toavoidthis,anXMLconvertershouldbeimplementedinthemodule.Thefollowingcodesnippetillustratesapossiblesolution:
如果你用更新模块重新编辑应用程序并重新发布,已有的用户将不能用这个应用程序。在应用程序启动时,将显示一个信息,指出有错误发生,在加载应用程序模型差异。为了避免这个错误提示,应当在模块中实现一个XML转换器。下面代码说明一个可能的解决方案:
| ||||||
usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Updating; publicsealedpartialclassMyModule:ModuleBase,IModelXmlConverter{ //... publicvoidConvertXml(ConvertXmlParametersparameters){ if(typeof(IModelOptions).IsAssignableFrom(parameters.NodeType)){ stringproperty="OperatingMode"; if(parameters.ContainsKey(property)){ stringvalue=parameters.Values[property]; if(!Enum.IsDefined(typeof(OperatingMode),value)){ switch(value.ToLower()){ case"complex": parameters.Values[property]=OperatingMode.Advanced.ToString(); break; default: parameters.Values[property]=OperatingMode.Basic.ToString(); break; } } } } } } ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Updating PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelXmlConverter '... PublicSubConvertXml(ByValparametersAsConvertXmlParameters) IfGetType(IModelOptions).IsAssignableFrom(parameters.NodeType)Then Dim[property]AsString="OperatingMode" Ifparameters.ContainsKey([property])Then DimvalueAsString=parameters.Values([property]) If(NotSystem.Enum.IsDefined(GetType(OperatingMode),value))Then SelectCasevalue.ToLower() Case"complex" parameters.Values([property])=OperatingMode.Advanced.ToString() CaseElse parameters.Values([property])=OperatingMode.Basic.ToString() EndSelect EndIf EndIf EndIf EndSub EndClass |
C# | usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Updating; publicsealedpartialclassMyModule:ModuleBase,IModelXmlConverter{ //... publicvoidConvertXml(ConvertXmlParametersparameters){ if(typeof(IModelOptions).IsAssignableFrom(parameters.NodeType)){ stringproperty="OperatingMode"; if(parameters.ContainsKey(property)){ stringvalue=parameters.Values[property]; if(!Enum.IsDefined(typeof(OperatingMode),value)){ switch(value.ToLower()){ case"complex": parameters.Values[property]=OperatingMode.Advanced.ToString(); break; default: parameters.Values[property]=OperatingMode.Basic.ToString(); break; } } } } } } |
VB | ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Updating PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelXmlConverter '... PublicSubConvertXml(ByValparametersAsConvertXmlParameters) IfGetType(IModelOptions).IsAssignableFrom(parameters.NodeType)Then Dim[property]AsString="OperatingMode" Ifparameters.ContainsKey([property])Then DimvalueAsString=parameters.Values([property]) If(NotSystem.Enum.IsDefined(GetType(OperatingMode),value))Then SelectCasevalue.ToLower() Case"complex" parameters.Values([property])=OperatingMode.Advanced.ToString() CaseElse parameters.Values([property])=OperatingMode.Basic.ToString() EndSelect EndIf EndIf EndIf EndSub EndClass |
TheconvertercheckswhetherthecurrentlyprocessednodeistheOptionsnode.Ifitis,theconvertercheckswhethertheOperatingModepropertyhasalegacyvalue.Then,the"Complex"valuebecomesOperatingMode.AdvancedandallothervaluesbecomeOperatingMode.Basic.
这个转换器检查当前处理的节点是否是选项节点。如果是,他将检查OperatingMode是否有值。接着,"Complex"值变为OperatingMode.Advanced并且其他值变为OperatingMode.Basic。
Now,consideranotherverycommonscenariowhenanode'spropertyisrenamed.Suppose,aModepropertydeclaredintheOptionsnodewasrenamedtoOperatingMode.ThefollowingcodesnippetillustratesapossibleXMLconverter:
现在,考虑另一种常用的情况,重命名一个节点的属性。假设,重命名一个定义在选项节点中模型属性。下面代码说明一个可能的XML转换器:
| ||||||
usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Updating; publicsealedpartialclassMyModule:ModuleBase,IModelXmlConverter{ //... publicvoidConvertXml(ConvertXmlParametersparameters){ if(typeof(IModelOptions).IsAssignableFrom(parameters.NodeType)){ stringoldProperty="Mode"; stringnewProperty="OperatingMode"; if(parameters.ContainsKey(oldProperty)){ parameters.Values[newProperty]=parameters.Values[oldProperty]; parameters.Values.Remove(oldProperty); } } } } ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Updating PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelXmlConverter '... PublicSubConvertXml(ByValparametersAsConvertXmlParameters) IfGetType(IModelOptions).IsAssignableFrom(parameters.NodeType)Then DimoldPropertyAsString="Mode" DimnewPropertyAsString="OperatingMode" Ifparameters.ContainsKey(oldProperty)Then parameters.Values(newProperty)=parameters.Values(oldProperty) parameters.Values.Remove(oldProperty) EndIf EndIf EndSub EndClass Private<ModCod |
C# | usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Updating; publicsealedpartialclassMyModule:ModuleBase,IModelXmlConverter{ //... publicvoidConvertXml(ConvertXmlParametersparameters){ if(typeof(IModelOptions).IsAssignableFrom(parameters.NodeType)){ stringoldProperty="Mode"; stringnewProperty="OperatingMode"; if(parameters.ContainsKey(oldProperty)){ parameters.Values[newProperty]=parameters.Values[oldProperty]; parameters.Values.Remove(oldProperty); } } } } |
VB | ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Updating PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelXmlConverter '... PublicSubConvertXml(ByValparametersAsConvertXmlParameters) IfGetType(IModelOptions).IsAssignableFrom(parameters.NodeType)Then DimoldPropertyAsString="Mode" DimnewPropertyAsString="OperatingMode" Ifparameters.ContainsKey(oldProperty)Then parameters.Values(newProperty)=parameters.Values(oldProperty) parameters.Values.Remove(oldProperty) EndIf EndIf EndSub EndClass Private<ModCod |
Asillustratedbytheexamples,anXMLconverterworkswithonenodeatatime.So,complexconversions,affectingseveralnodesatonce,arenotpossible.Inthesecases,specialupdatersimplementingthe
用例子说明,一个XML转换器一次由一个节点工作。接着,复杂的转换,不可能一次影响几个节点。在这种情况下,应当用指定的更新器实现
ImplementaNodeUpdater(属性一个节点更新器)
Anodeupdaterisrepresentedbyaclassimplementingthe
一个节点更新器表示一个类实现
SupposeyourapplicationusesamodulewhichaddsanOperatingModestringpropertytotheApplicationModel'sOptionsnode.Originally,theinterfaceextendingtheApplicationModellookslikethis:
假设你用了一个应用程序给应用程序模型的选项节点添加一个字符串属性OperatingMode的模块,最初,接口扩展应用程序模型如下:
| ||||||
publicinterfaceIModelMyOptions{ OperatingModeOperatingMode{get;set;} } publicenumOperatingMode{Basic,Advanced} PublicInterfaceIModelMyOptions PropertyOperatingMode()AsOperatingMode EndInterface PublicEnumOperatingMode Basic Advanced EndEnum |
C# | publicinterfaceIModelMyOptions{ OperatingModeOperatingMode{get;set;} } publicenumOperatingMode{Basic,Advanced} |
VB | PublicInterfaceIModelMyOptions PropertyOperatingMode()AsOperatingMode EndInterface PublicEnumOperatingMode Basic Advanced EndEnum |
Then,themoduleisupdatedtoanewversionwhichmovesthepropertytoanewlyintroducedchildnode:
然后,模组更新到一个新的版本,移动到新推出的子节点的属性:
| ||||||
usingDevExpress.ExpressApp.Model; publicinterfaceIModelMyOptions{ IModelChildOptionsChildOptions{get;} } publicinterfaceIModelChildOptions:IModelNode{ OperatingModeOperatingMode{get;set;} } publicenumOperatingMode{Basic,Advanced} ImportsDevExpress.ExpressApp.Model PublicInterfaceIModelMyOptions ReadOnlyPropertyChildOptions()AsIModelChildOptions EndInterface PublicInterfaceIModelChildOptions InheritsIModelNode PropertyOperatingMode()AsOperatingMode EndInterface PublicEnumOperatingMode Basic Advanced EndEnum |
C# | usingDevExpress.ExpressApp.Model; publicinterfaceIModelMyOptions{ IModelChildOptionsChildOptions{get;} } publicinterfaceIModelChildOptions:IModelNode{ OperatingModeOperatingMode{get;set;} } publicenumOperatingMode{Basic,Advanced} |
VB | ImportsDevExpress.ExpressApp.Model PublicInterfaceIModelMyOptions ReadOnlyPropertyChildOptions()AsIModelChildOptions EndInterface PublicInterfaceIModelChildOptions InheritsIModelNode PropertyOperatingMode()AsOperatingMode EndInterface PublicEnumOperatingMode Basic Advanced EndEnum |
Ifyounowrecompiletheapplicationwiththeupdatedmoduleandredistributeit,theoriginalOperatingModepropertyvaluesspecifiedbyusersoftheapplicationwillbelost.Toavoidthis,anodeupdatershouldbeimplemented.Apossibleplacefortheimplementationistheupdatedmodule:
如果你用更新模块重新编辑应用程序并重新发布,已有的用户将不能用这个应用程序。原来OperatingMode所指定的属性值将会丢失应用程序的用户。为了避免这种情况,应当实现一个节点更新器。更新模块可能用一下方法实现。
| ||||||
usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Model.Core; publicsealedpartialclassMyModule:ModuleBase,IModelNodeUpdater<IModelOptions>{ //... publicvoidUpdateNode(IModelOptionsnode,IModelApplicationapplication){ stringmyProperty="OperatingMode"; if(node.HasValue(myProperty)){ stringvalue=node.GetValue<string>(myProperty); node.ClearValue(myProperty); ((IModelMyOptions)node).ChildOptions.OperatingMode= (OperatingMode)Enum.Parse(typeof(OperatingMode),value); } } } ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Model.Core PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelNodeUpdater(OfIModelOptions) '... PublicSubUpdateNode(ByValnodeAsIModelOptions,ByValapplicationAsIModelApplication) DimmyPropertyAsString="OperatingMode" Ifnode.HasValue(myProperty)Then DimvalueAsString=node.GetValue(OfString)(myProperty) node.ClearValue(myProperty) CType(node,IModelMyOptions).ChildOptions.OperatingMode=_ CType(System.Enum.Parse(GetType(OperatingMode),value),OperatingMode) EndIf EndSub EndClass |
C# | usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Model.Core; publicsealedpartialclassMyModule:ModuleBase,IModelNodeUpdater<IModelOptions>{ //... publicvoidUpdateNode(IModelOptionsnode,IModelApplicationapplication){ stringmyProperty="OperatingMode"; if(node.HasValue(myProperty)){ stringvalue=node.GetValue<string>(myProperty); node.ClearValue(myProperty); ((IModelMyOptions)node).ChildOptions.OperatingMode= (OperatingMode)Enum.Parse(typeof(OperatingMode),value); } } } |
VB | ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Model.Core PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelNodeUpdater(OfIModelOptions) '... PublicSubUpdateNode(ByValnodeAsIModelOptions,ByValapplicationAsIModelApplication) DimmyPropertyAsString="OperatingMode" Ifnode.HasValue(myProperty)Then DimvalueAsString=node.GetValue(OfString)(myProperty) node.ClearValue(myProperty) CType(node,IModelMyOptions).ChildOptions.OperatingMode=_ CType(System.Enum.Parse(GetType(OperatingMode),value),OperatingMode) EndIf EndSub EndClass |
TheupdaterintheexamplecheckswhetherthecurrentlyprocessednodehasalegacyOperatingModepropertyvalue.Ifthereissuchavalue,itisassignedtothenewOperatingModeproperty,andthelegacypropertyvalueiscleared.
在实例中检查是否当前处理节点有一个OperatingMode属性值。如果有值,它被标识为新的OperatingMode属性并清除之前的值。
Notethatsinceanodeupdatercanbeimplementedanywhereintheapplication,theupdatershouldberegisteredviathe
注意,一个节点的更新可以在任何应用程序实现,这个更新者应该通过
| ||||||
usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Model.Core; publicsealedpartialclassMyModule:ModuleBase,IModelNodeUpdater<IModelOptions>{ //... publicoverridevoidAddModelNodeUpdaters(IModelNodeUpdaterRegistratorupdaterRegistrator){ base.AddModelNodeUpdaters(updaterRegistrator); updaterRegistrator.AddUpdater<IModelOptions>(this); } }ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Model.Core PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelNodeUpdater(OfIModelOptions) '... PublicOverridesSubAddModelNodeUpdaters(_ ByValupdaterRegistratorAsIModelNodeUpdaterRegistrator) MyBase.AddModelNodeUpdaters(updaterRegistrator) updaterRegistrator.AddUpdater(OfIModelOptions)(Me) EndSub EndClass |
C# | usingDevExpress.ExpressApp.Model; usingDevExpress.ExpressApp.Model.Core; publicsealedpartialclassMyModule:ModuleBase,IModelNodeUpdater<IModelOptions>{ //... publicoverridevoidAddModelNodeUpdaters(IModelNodeUpdaterRegistratorupdaterRegistrator){ base.AddModelNodeUpdaters(updaterRegistrator); updaterRegistrator.AddUpdater<IModelOptions>(this); } } |
VB | ImportsDevExpress.ExpressApp.Model ImportsDevExpress.ExpressApp.Model.Core PublicNotInheritablePartialClassMyModule InheritsModuleBase ImplementsIModelNodeUpdater(OfIModelOptions) '... PublicOverridesSubAddModelNodeUpdaters(_ ByValupdaterRegistratorAsIModelNodeUpdaterRegistrator) MyBase.AddModelNodeUpdaters(updaterRegistrator) updaterRegistrator.AddUpdater(OfIModelOptions)(Me) EndSub EndClass |
相关文章推荐
- 能在不同的深度学习框架之间转换模型?微软的MMdnn做到了
- XAF 用代码访问应用程序模型
- XAF 应用程序模型基础[转]
- XAF 如何扩展应用程序模型(How to: Extend the Application Model )<一> ListView显示页脚信息
- XAF 如何扩展应用程序模型<二> 编辑ListView自动保存
- XAF 应用程序模型基础[转]
- XAF 应用程序模型架构
- 深度学习 - 不同深度学习模型间的转换
- XAF应用开发教程(四)应用程序模型
- 使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码
- XAF 应用程序模型中业务模型
- XAF 应用程序模型
- XAF 应用程序模型基础
- Tensorflow 模型文件格式转换
- 源码研读Mycat1.6之网络篇---前端线程模型(应用程序与mycat交互篇)上篇
- 对E-R模型向关系模式转换的认识
- hdu 4474 Yet Another Multiple Problem 模型转换 BFS搜索 根据剩余类建图广搜
- OpenCV中图像不同定义类型间的转换
- TensorFlow 深度学习框架(6)-- mnist 数字识别及不同模型效果比较
- Openlayers中不同投影间的转换