eXpressApp FrameworkXAFのスマヌトフォヌム。 パヌト2-メタモデルUIアプリケヌション



最初の郚分では、ビゞネス゚ンティティのコヌドの属性を䜿甚しお、単玔なビゞネスルヌルデヌタ制埡、匷調衚瀺の制埡、フィヌルドのアクセシビリティず可芖性を远加するこずにより、eXpressAppフレヌムワヌクのフォヌムを「アニメヌション化」する方法に぀いお説明したした。 このパヌトでは、別名Application ModelアプリケヌションのXAFメタモデルを蚭定しおこの問題を解決する方法に぀いお説明したす。たた、実際、このメタモデルが必芁な理由ず内郚から構築する方法に぀いお説明したす。

開発者によるメタモデルの拡匵、ビゞュアル゚ディタヌのモデル゚ディタヌを介した゚ンドナヌザヌによるメタモデルの線集など、幅広い可胜性を忘れたせん。 たた、この蚘事を読んだ埌は、XAFメタモデルずXAFML蚘述蚀語、よく知られおいるすべおのCSSずXAMLQML、LSMLなど、およびこれらの技術に組み蟌たれた詳现なアむデアの間にいく぀かの類䌌点があるず思いたす。 このような家庭甚自転車の構造の珍しい補品に぀いお詳しく知るこずを恐れない人はちなみに、マむクロ゜フトにアナログが登堎する前に曞かれた、猫の䞋で歓迎しおください。







ビゞネス゚ンティティコヌドの属性ず メタモデルの蚭定



したがっお、前の蚘事の元のビゞネス゚ンティティに䜕が起こったのかを批刀的に芋るず、さたざたな属性の豊富さから誰かを間違いなく怖がらせるこずができたす。



  1. [ DomainComponent ]
  2. パブリック むンタヌフェむス IAccount {
  3. [ RuleRequiredField、RuleUniqueValue ]
  4. [ RuleRegularExpression  @ "^ [_ a-z0-9-] +。[_ A-z0-9-] +* @ [a-z0-9-] +。[A-z0-9-] + *。[az] {2,4}$ "  ]
  5. 文字列メヌル{ get ; セット; }
  6. [ FieldSize  25  ]
  7. [ ImmediatePostData ]
  8. [倖芳 "MarkUnsafePasswordInRed" 、 "Lenパスワヌド<6" 、FontColor = "Red"  ]
  9. string Password { get ; セット; }
  10. }
  11. [ XafDefaultProperty  "FullName"  ]
  12. [ DomainComponent、ImageName  "BO_Person"  ]
  13. パブリック むンタヌフェむス IPerson {
  14. 文字列 LastName { get ; セット; }
  15. 文字列 FirstName { get ; セット; }
  16. [蚈算枈み "ConcatIsNullFirstName、 ''、 ''、IsNullLastName、 ''" ]
  17. 文字列 FullName { get ; }
  18. DateTime Birthday { get ; セット; }
  19. }
  20. [ DomainComponent ]
  21. パブリック むンタヌフェむス IOrganization {
  22. [ RuleRequiredField ]
  23. 文字列 Name { get ; セット; }
  24. [集蚈]
  25. IList < IPerson > Staff { get ; }
  26. [ RuleRequiredField  TargetCriteria = "Staff.Count> 0"  ]
  27. [ DataSourceProperty  "Staff"  / *、DataSourceCriteria "StartsWithFirstName、 '123'"* / ]
  28. [倖芳 "ChangeManagerAvailabilityAgainstStaff" 、 "Staff.Count = 0" 、Visibility = ViewItemVisibility。Hide、Context = "DetailView"  ]
  29. IPersonマネヌゞャヌ{ get ; セット; }
  30. }




ビゞネス゚ンティティのコヌドでナヌザヌむンタヌフェむスの倖芳ず動䜜を盎接指定する属性を豊富に䜿甚するこずは、「パスアンドフォヌゲット」プロゞェクトの開発速床を倧幅に向䞊させるのに圹立ちたすが、倧芏暡プロゞェクトではそれほど䟿利ではありたせん。 たた、eXpressApp Frameworkアセンブリぞの参照が望たしくない可胜性があるシナリオも忘れないでくださいたずえば、ビゞネス゚ンティティの同じラむブラリを䜿甚するが、そこに「巊」属性がないXAF以倖のプロゞェクト。 最埌に、䞊蚘のコヌドの読みやすさず悪臭の可胜性に぀いおも説明しおいたせん。



アプリケヌションのナヌザヌむンタヌフェむスの倖芳ず動䜜を構成し、理想的にはむンタヌフェむスから分離する必芁のあるビゞネスロゞックに盎接関連しない他の蚭定を保存するための別の集䞭管理された堎所があれば玠晎らしいでしょう。 別のレベルぞの蚭定の郚分的たたは完党な転送は、ナヌザヌむンタヌフェヌスからビゞネスロゞックのカツレツずパの分離のフォロワヌの前にあなたの魂を浄化するだけでなく、コヌドをよりクリヌンでシンプルにし、高床なビゞュアル゚ディタヌを䜿甚しお開発プロセスをより快適にするこずも可胜です。



ただし、これらのアプロヌチの1぀が理想的であり、他のアプロヌチの䜿甚が犁止されおいるこずを明確に蚀うこずはできたせん。 それどころか、これらのアプロヌチはそれぞれ、開発者の歊噚庫での䜍眮に倀するものであり、プロゞェクトの条件サむズ、緊急床などに応じお適甚する必芁があるず確信しおいたす。 たずえば、メむンWebサむトフロント゚ンドは通垞の非XAFASP.NETアプリケヌションであり、むンタヌフェむスにビゞュアルASP.NETコンポヌネントを䜿甚し、デヌタアクセスにORMラむブラリeXpress氞続オブゞェクトXPOを䜿甚したす。 同時に、ビゞネス゚ンティティ顧客、問題、バグレポヌト、質問などを含むラむブラリは、eXpressAppフレヌムワヌクぞのリンクを持たず、XAFで蚘述されたいく぀かの内郚アプリケヌションバック゚ンドで䜿甚されたすが、XAF固有の属性ず゚ンティティを䜿甚したせん。 この堎合、これらのビゞネス゚ンティティの衚珟のすべおの蚭定は、個々のXAFモゞュヌルのメタデヌタを通じお行われたす。



アプリケヌションメタモデルたたはさらにタマネギ...



このようなXAFの蚭定のリポゞトリは、UIの倖芳ず動䜜を蚘述するメタデヌタのレむダヌであるアプリケヌションモデルです。 技術的には、これは1぀の局だけでなく、重ね合せの原理に埓っお匓の頭のように倉化が互いの䞊に重なる局の集たりです。 最初の局、いわゆる「れロ」 保護リングは 、フレヌムワヌク自䜓によっお次のように圢成されたす。フレヌムワヌクは、プロゞェクトを分析し、珟圚のモゞュヌルに含たれるすべおの接続されたビゞネスモデル、コントロヌラヌ、チヌム、゚ディタヌ、およびその他の゚ンティティに関する情報を収集したす䟝存関係。 次に、アプリケヌションの皮類に぀いお収集された情報から、実際には、オブゞェクトの衚瀺ビュヌ、ナビゲヌションシステムずコマンド、ロヌカリれヌションなどを含むナヌザヌむンタヌフェむスのすべおの偎面を芏制する特別なメタデヌタが生成されたす。

XAFアプリケヌションの䞀般的なアヌキテクチャにおけるメタモデルの堎所をよりよく理解するために、小さな図を瀺したす。







XAF甚語におけるレむダヌ間の倉曎たたは盞違は、䞀般にモデルの盞違ず呌ばれたす。 したがっお、これらの違いを含むXMLモゞュヌルファむルの名前は「Model.DesignedDiffs.XAFML」です。 各レむダヌのコンテンツをいく぀かの方法で倉曎できるこずに泚意しおください。



1.特別なビゞュアル゚ディタヌ- モデル゚ディタヌ ;

2. XAFMLファむルを盎接線集する。

3.プログラムコヌドを通じお。



すべおのレむダヌの重ね合わせにより、最終的なアプリケヌションモデルが圢成されたす。







ここで、アプリケヌションの「最終」モデルずは、開発者が䜕らかの芁玠たたはそのプロパティを参照するずきにコヌドで受け取るものを意味したす。 たた、メタモデル自䜓は「怠laz」です。 重ね合わせは、必芁な堎合にのみ蚈算されたす。たずえば、ある皮のナヌザヌむンタヌフェむス画面を䜜成する必芁がある堎合、内郚APIからの芁求に応じお蚈算されたす。 ここで、これらの蚈算はアクセスされるたびに行われるのではなく、実行䞭に正しくキャッシュされるこずに泚意するこずが重芁です。



ここではレむダヌに぀いお詳しく説明しおいたすが、フレヌムワヌクのフレヌムワヌクの倖には非垞に倚くのアプリケヌションやテクノロゞヌがあり、レむダヌがたったくないため、XAMLを䟋に挙げおいたす。 したがっお、XAFアプリケヌションの倚局メタモデルを䜜成する䞻な理由/芁件を以䞋にリストしたす。



1.耇数のプラットフォヌム甚にアプリケヌションを柔軟に構成する機胜。

2.実行時のアプリケヌション構成による開発の加速。

3.暙準動䜜を倉曎するカスタムモゞュヌルの簡単な開発。

4.管理者が既にデプロむされたアプリケヌションを䞀元的に構成する機胜。

5.゚ンドナヌザヌのアプリケヌションの倖芳ず動䜜を個別に倉曎する機胜たずえば、アクセス暩に基づいお動的に倉曎する機胜。



メタモデルの実甚䟋



理論は十分だず思いたすが、実際にメタモデルを䜿甚しおみたしょう。 これを行うには、アプリケヌションを再構築し、以前のアプリケヌションのプラットフォヌムに䟝存しないモゞュヌルのModel.DesignedDiffs.xafmlファむルをダブルクリックしたすたたは゜リュヌション゚クスプロヌラヌのコンテキストメニュヌから察応するコマンドを呌び出したす。







これにより、䞊の図に瀺すように、モデル゚ディタヌモデル゚ディタヌが開きたす。 簡単に蚀えば、この゚ディタヌは、巊偎にすべおのモデル芁玠があり、右偎にプロパティむンスペクタヌがあるツリヌを備えたかなり「スパルタン」なむンタヌフェヌスですモデルレむダヌをすばやく怜玢、ロヌカラむズ、マヌゞするための組み蟌みツヌルもありたすが、ここでは詳しく説明したせん英語のドキュメントに蚘茉されおいたす。

この図から、メタモデルによっお制埡されるアプリケヌションの偎面をすばやく評䟡できたす。 ずころで、ここで芋られるのは、珟圚のモゞュヌルずその䟝存関係で芋぀かったタむプに埓っお、XAFによっお生成されたモデルのれロレむダヌの芖芚的衚珟です。



フォヌムの1぀の倖芳ICustomer_ListViewを突然少し倉曎する必芁があったず想像しおください。 1぀の列を削陀し、別の列の䞊べ替えを蚭定し、列の順序を倉曎し、最埌にアプリケヌションをロシア語にロヌカラむズするず、このXMLは察応するレむダヌHabr.Module / ModelDesignedDiffs.XAFMLに保存されたす。前のレむダヌずの違い



  1. <xml version = "1.0" encoding = "utf-8" >
  2. <アプリケヌション タむトル = "HabrDemo" ロゎ = "ExpressAppLogo" >
  3. <ビュヌ>
  4. <ListView Id = "ICustomer_ListView" >
  5. <コラム>
  6. <ColumnInfo Id = "Name" SortOrder = "Descending" />
  7. <ColumnInfo Id = "Email" Index = "1" />
  8. <ColumnInfo Id = "Manager" Index = "2" />
  9. <ColumnInfo Id = "パスワヌド" 削陀 = "True" />
  10. </列>
  11. </リストビュヌ>
  12. </ビュヌ>
  13. </アプリケヌション>


*スペヌスを節玄するために、ここでは個別のXAFMLファむルが䜜成されるロヌカリれヌションを特に提䟛したせん。



アプリケヌションを実行するず、蚭定が期埅どおりに適甚されおいるこずがわかりたす列の䞊べ替えず䞊べ替えに泚意しおください。







技術的には、これは暙準XAFモゞュヌルからのコヌドがメタモデルに倉わり、それに応じおコントロヌルを構成したこずを意味したす。



特に、Visual Studioではなく、実行時にアプリケヌションをセットアップするシナリオを匷調したいず思いたす。 この堎合、アプリケヌションの実行䞭に行われたすべおの蚭定は、最埌のレむダヌであるナヌザヌ蚭定レむダヌに分類されたす。 デフォルトでは、この最埌のレむダヌはModel.User.XAFMLファむルで衚されたすが、経隓から、ほずんどの人はデヌタベヌス内のファむルストレヌゞを奜みたす将来的にはこれをデフォルトの動䜜にする可胜性が高いです。 匷力なDevExpressコントロヌルのおかげで、アプリケヌションのセットアップには特別なスキルやツヌルは必芁なく、ほずんどの堎合、゚ンドナヌザヌ自身で実行できたす。 たずえば、ナヌザヌは、芖芚コントロヌル自䜓のツヌルを䜿甚しお、䞊べ替え、フィルタヌのグルヌプ化、フォヌム䞊のコントロヌルの堎所、サむズなどを倉曎できたす。 より现かな調敎が必芁で、䞊玚ナヌザヌたたは開発者である堎合、サヌビスにはモデル゚ディタヌがあり、実行時にも䜿甚できたす。

次に、ビゞュアル゚ディタヌを䜿甚しお詳现なフォヌムをすばやくカスタマむズする方法を芋おみたしょう。 これはビデオよりもうたく蚌明できないず思いたす。



「ゎム」自動生成フォヌムの抂念は、基本的に開発者の䜜業を楜にするこずを目的ずしおおり、2぀の䞻な問題を解決したす。



1.開発段階でのフォヌムのより䟿利で迅速な構成

2.より䟿利な展開ずアプリケヌションサポヌト



最初の方法は、提案されたアプロヌチを䜿甚するず、数癟のフィヌルドを耇雑な圢に揃えるのに䜕時間も費やす必芁がなく、ビゞネスモデルに新しいフィヌルドが衚瀺された堎合にすべおをやり盎す必芁があるためです。 メタデヌタはビゞネス゚ンティティに基づいお動的に生成されるため、開発䞭にビゞネスモデルを自由に倉曎でき、倉曎がアプリケヌションモデルに自動的に圱響するこずを確認できたすもちろん、ビゞネス゚ンティティの倉曎をフォヌム蚭定に「修正」する機䌚がありたすそれらには圱響したせんでした。



2番目の方法は、フォヌムのカスタマむズを゚ンドナヌザヌたたはアプリケヌション管理者に提䟛する機胜により可胜です。このタスクは実行時に完党に実行できるためです。 マルチレむダヌアプリケヌションモデルにより、管理者レベルで技術的にはモデルの䞀郚のサブレむダヌで必芁な倉曎を䞀床行うこずで、゚ンドナヌザヌアプリケヌションの蚭定を䞀元的に倉曎できたす。

カスタム蚭定をメむンアプリケヌションたたはモゞュヌルの䞀郚にするには、組み蟌みモデル゚ディタヌの特別な拡匵機胜であるModel Merge Toolを䜿甚できたす。







このツヌルを䜿甚するず、メタモデルの゜ヌスレむダヌずタヌゲットレむダヌを遞択し、実際にそれらを1぀にマヌゞできたす。



メタモデルの内郚構造ず拡匵に぀いおもう少し



䞊蚘では、XAFMLファむルの䞀郚を瀺したした。おそらく、アプリケヌション、ビュヌ、リストビュヌ、およびメタモデルの別個の芁玠であるその他の芁玠に気づいたでしょう。 内郚では、これらの芁玠は、最初の蚘事で既に知られおいるドメむンコンポヌネントDCテクノロゞを介しお実装されたす厳密には、Silverlightから完党な.NETずほが同じ方法で䞻芁なものを参照する軜量バヌゞョンを通じお

  1. パブリック むンタヌフェむス IModelListView  IModelObjectView、IModelView、IModelNode
  2. {
  3. IModelColumns Columns { get ; }
  4. [ DataSourceProperty  "Application.Views"  、DataSourceCriteria  "AsObjectViewはNullではないおよびAsObjectView.ModelClassはNullではないおよび '@ This.ModelClass'はNullではないおよびAsObjectView.ModelClass.Name = '@ This.ModelClass.Name ' "  ]
  5. IModelDetailView DetailView { get ; セット; }
  6. [ DataSourceProperty  "ModelClass.ListEditorsType"  ]
  7. EditorType { get ; セット; }
  8. IModelSorting Sorting { get ; }
  9. bool UseServerMode { get ; セット; }
  10. ...およびオブゞェクトのリストリストビュヌでフォヌムを特城付けるその他のプロパティ
  11. }




おそらくDCの䞻な機胜から既に理解しおいるように、モデル芁玠を衚すすべおのロゞックずフィヌルドを持぀実際のクラスは、むンタヌフェむスず関連する特別なロゞッククラスから動的に組み立おられたす。 䞊蚘で、モデルでの蚈算倀のキャッシュに぀いおは既に述べたしたが、動的タむプの生成は非垞に高速な操䜜ではないため、アプリケヌションのロヌドを高速化するキャッシュもありたす特にこれらのタむプが数癟および数千ある堎合。 ぀たり、動的モデルタむプのアセンブリは、アプリケヌションが最初に起動されたずきに䞀床だけ発生したす。 次に、実行可胜ファむルの暪にある特別なModelAssembly.dllアセンブリに保存されたすちなみに、DCでも同じこずが行われ、 DcAssembly.dllにのみ入りたす 。 次に、通垞どおりこれらのアセンブリから型が盎接読み蟌たれたす。 ちなみに、これらの2぀のアセンブリをReflectorで遅延させお開いお、これらすべおのむンタヌフェむスが䜕に倉わったかを確認しおください:-)



モデル芁玠の暙準セットは、デフォルトで新しいXAFプロゞェクトに接続するシステムモゞュヌルから取埗されたす。 レむダヌは異なる「スキヌマ」XMLの堎合を持぀こずができるこずに泚意しおください。 アプリケヌションモデルの芁玠のアクセス可胜なセットたたはスキヌム。これは、レむダヌの構築に䜿甚されるモゞュヌルに盎接䟝存したす。 したがっお、たずえば、プラットフォヌムに䟝存しないモゞュヌルでリストビュヌ構造を定矩するアプリケヌションモデル芁玠であるIModelListViewがありたす。 プラットフォヌム固有の芁玠であるIModelListViewWebずIModelListViewWinもあり、オブゞェクトのリストでフォヌムを特城付ける独自のプロパティセットがありたす。 実際には、これは、WebモゞュヌルHabr.Module.Web / ModelDesignedDiffs.XAFMLのモデル゚ディタヌを開くず、新しい芁玠ずオプション、たずえばSaveListViewStateInCookiesが衚瀺されるこずを意味したす。



このスキヌムは、远加機胜を実装するずきに開発者の裁量で拡匵できるこずが重芁です。 たずえば、暙準のリストビュヌ芁玠たたはコヌドを所有しおいない他の芁玠を蚭定するための独自のオプションを远加するには、次のコヌドをモゞュヌルに远加したす。



  1. パブリック むンタヌフェむス IModelListViewEx {
  2. 文字列 MyCoolOption { get ; セット; }
  3. }
  4. public override void ExtendModelInterfaces  ModelInterfaceExtenders extenders  {
  5. ベヌスの ExtendModelInterfaces ゚クステンダヌ ;
  6. ゚クステンダヌ。 远加 < IModelListView、IModelListViewEx >   ;
  7. }




芁玠コヌドを所有しおいる堎合、このオプションをむンタヌフェむスに远加するか、むンタヌフェむス拡匵を明瀺的に「ミックス」したす。



  1. パブリック むンタヌフェむス IModelLayoutViewItem  IModelLayoutItem、IModelViewLayoutElement、IModelLayoutElementWithCaptionOptions、IModelNode、ISupportControlAlignment、IModelToolTip、IModelToolTipOptions




もちろん、開発者は、れロレむダヌの生成実際には、暙準およびカスタムモデル芁玠の独自のゞェネレヌタヌを䜜成できたす、動䜜のカスタマむズ、モデル゚ディタヌでの衚瀺など、モデル構築の他の偎面を柔軟に制埡できたす。



おわりに



結論ずしお、䞻にこのような匷力なマルチレむダヌおよびダむナミックメタデヌタレむダヌが存圚するため、フレヌムワヌクは同じコヌドベヌスを䜿甚しお耇数のプラットフォヌムのアプリケヌションむンタヌフェヌス「UI Scaffolding」ずいう流行語を挿入せざるを埗たせんを自動的に構築できたす䞀般的に、これらはビゞネス゚ンティティ、コントロヌラヌ、チヌム、ナヌザヌ゚ディタヌなどです。 したがっお、私たちのケヌスでは、数分のうちに1぀のビゞネス゚ンティティICustomerしか持たず、WindowsずWeb甚のアプリケヌションを䜜成および構成したした。 たた、䞀般に、䞻にメタモデルの機胜のおかげで、これらのプラットフォヌムのよく知られおいる欠点を平準化たたは隠すこずによっお、䞀郚のWindowsフォヌムおよびWebフォヌム開発者の生掻を改善しおいたす。 したがっお、XAFを䜿甚するず、開発者はXAMLの楜園から「グッズ」の類䌌物を取埗できたすが、新しいものを孊ぶこずに投資するこずなく、開発アプロヌチを完党に倉曎するこずなく、叀き良きプラットフォヌムに留たるこずができたす。䜕幎も経った今もXAFぞの関心が安定しおいるこずを説明しおください。



もちろん、マむナス面もいく぀かありたしたが、ナヌザヌのこずではなく、このすべおの開発者ずしお、圌らは私たちだけに関係しおいたす。 実際、私たちのチヌムの少数の人々は、数千のブロックテストず機胜テストにもかかわらず、手を掗わずに祈るこずなく、メタモデル゚ンゞンのコアのバグを修正するこずを請け負いたす-゚ラヌを犯したり、少なくずも誀っおパフォヌマンスを悪化させるリスクが倚すぎたす。 魂を喜ばせずにはいられない唯䞀のこずは、フレヌムワヌクの6幎の歎史にわたっお、すべおの小児疟患がすでに治癒しおおり、カヌネル領域にほずんどバグがないずいう事実です:-)



そしお最埌に、 ドキュメントの倚数の蚘事 英語で、アプリケヌションメタモデルの機胜、その拡匵ず構成の方法、およびXAFフレヌムワヌク自䜓に぀いお詳しく知るこずができたす。 前回のDevConでのプレれンテヌションでこのビデオに興味を持぀人がいるかもしれたせんが、時間の制玄のため、補品ずその機胜の非垞に䞀般的な抂芁を説明する必芁があったこずを譊告したす。



All Articles