XAF + Entity Frameworkを使用したビジネスアプリケーションだけでなく、WindowsおよびWeb CRUDインターフェイスの動的作成。 パート1

数年前にDevExpress eXpressApp Framework(XAF)の開発者の1人によって数時間前に書かれた、ローカルライブラリで文献を読んで興味深い補充物を見つけるための古いDXLibrary Webアプリケーションがあります。 アプリケーションデータはMicrosoft SQL Serverに保存され、それらの操作はDevExpress eXpress永続オブジェクトORM(XPO)を介して行われます。 この奇跡は依然としてその卓越した機能を許容範囲内で果たしているため、現在の現実の下でインターフェイスを少し更新したかったのです。 デコレーションに加えて、内部のXPOをMicrosoft ADO.NET Entity Framework(EF)に変更したいと思います。 画像 私にとってここでの主な動機は、EFがより良いものでも悪いものでもない(両方のORMが彼らのタスクに優れていることを長い間証明している)ことではありませんが、これまでのところ、XAFとHabréでのEF統合に関するロシア語のガイドはありませんでしたが、彼らはすでに「最初の結婚年ではありません」。 このギャップを埋めたいという大きな要望があります。「司書」のユーザーからのいくつかの最近のリクエストを実装したいだけです。 最後に、バージョン15.1から、XAFはタッチデバイスに適合した更新されたWebインターフェイスを提供します。これを非表示にするのが罪であることをコミュニティにもう一度示したいと思います:-)



これは、既存のデータベース(DB)または上記のサブジェクト領域の構造を表す既製のEFモデルを使用して、Webおよびデスクトップの基幹業務(LOB)アプリケーションの生成を高速化するオプションを段階的に示す一連の投稿の最初の紹介部分です。 ユーザーインターフェースは、ASP.NET WebForms / HTML5テクノロジーとWinFormsテクノロジーの組み合わせ、およびDevExpressの対応するビジュアルコンポーネントに基づいて自動的に作成され、XAFの厳格なガイダンスの下でランタイムにまとめられます。 XAFは私たちのモジュラーMVCフレームワークであり、実際、ほぼ10年以上にわたって開発されており、.NET開発者向けにOfficeのようなビジネスアプリケーションを迅速に作成するための一連のベストパターンとプラクティスを常に拡大しています( Habr サイトで詳細をご覧ください )。





合格のための最小要件



1. .NET Framework 4+およびVisual Studio 2010+(Expressを除く完全版およびCommunity Editionのバージョンがサポートされています)-Visual Studio 2013を後で使用します。

2. Entity Framework 6ツール(Visual Studioのバージョンによっては、既に組み込まれているか、 個別にインストールする必要がある場合があります

3. DevExpress Universal v15.1のフルバージョン、または30日間の試用版。 登録およびSMSなしで無料で当社のWebサイトからダウンロードされ、SSDに数分でインストールされます。 突然v15.2 Betaにアクセスできる場合は、使用することをお勧めします。

4.データストレージ用のMicrosoft SQL Server(2000年以降のフル/エクスプレス/ localdbのすべてのバージョンが対応)またはEFがサポートする別のデータベースプロバイダー

5 *。 EFの一般的な知識、およびオブジェクトリレーショナルマッピング( ORM )およびフレームワークでの作業の基礎となるModel-View-Controller( MVC )の基本原則の理解も役立ちます。



始める前に、この種のフレームワーク、カスタマイズオプション、ORM選択についての私の考え
XAFは本質的にコードジェネレーターではないことを理解することが重要です。たとえば、類似製品であるDevExpress MVVMフレームワークとWPF / WinFormsのScaffolding Wizardです。 それどころか、XAFは実行時に完全に特定のルールに従ってユーザーインターフェイスを生成する実際の動的アプリケーションフレームワークです。 したがって、元のデータモデルへの変更(新しいクラスやプロパティの追加など)のたびにフォームの生成を手動で再開したり、生成されたフォームに以前に記述されたカスタムコードを失う必要はありません-XAFアプリケーションの実行後、実際の「 scaffolding 」UIおよびDB結果を常に自動的に取得します現在のデータ構造とルールセットに従って。 実際には、これは、デフォルトでは、通常のクライアントアプリケーション開発の場合のように、開発者がVisual Studioで直接アクセスできるCRAFフォームのソースコードがXAFで生成されないことを意味します。 XAF開発者は、UIタイプSystem.Windows.Forms.ControlまたはHTML要素の最終ブロックを引き続き完全に制御し、他の.NETアプリケーションと同様にそれらを操作できますが、ほとんどの場合、典型的なXAF開発プロセスには、より多くのシステムのセットアップが含まれます多くの場合、日付モデルの構造、デザイナーのクロスプラットフォームXML UI設定、またはコードのUI要素の抽象化により、高レベルです。 繰り返しますが、低レベルへのアクセスがあり、誰もあなたを制限しません。また、アプローチを混在させることもできますが、これはそれほど頻繁には必要ありません。そうでなければ、従来の開発と比べて何が得られますか? これは同時にXAFの最大の魅力であり不利な点でもあることを認めなければなりません。なぜなら、最初は人々が視覚制御を直接操作することから再調整して抽象化することは難しいからです。 したがって、初期段階の急な学習曲線。



おそらく、このようなRADツールでのUIの機能とさまざまな顧客のニーズに対するカスタマイズに関する疑問をすぐに解消する価値はあります。 フレームワークを使用して作成できる典型的なビジネスアプリケーションのUIをより適切に表示するには、製品ページ既製の図を確認し、デモアプリケーションをオンラインでライブで(またはインストーラーからデスクトップバージョンを同時にキャプチャすることで)ライブで再生し、最後にインターネットでは、たとえば、実際の顧客からの本番アプリケーションの例が、AMM、CnP、EAM、およびその他のソリューション( 1、2 )を備えたCISの多くによく知られている良いまたはいくつかの銀河です。 後者は、ちなみに「銀河系」チューニングスタジオを去りました:-) XAFARI -XAFプラットフォーム用の追加モジュールとコンポーネントのセット。 商用のサードパーティの拡張機能に加えて、無料のプロジェクトhttp://www.expandframework.comに言及せざるを得ませんこれは5年間コミュニティによって開発されてきました。 主にDevExpressのビジュアルコンポーネントを使用しているため、通常のデスクトップと、タブレットなどの小さな画面のタッチデバイスの両方で、開発者側で最小限の追加設定で作成されたアプリケーションを操作することができます。古き良きWinForms !)、しかしそれについては後で。



ORMの知識がまだない場合は、XAFを使用する前に、難しい選択に苦しむことになるでしょう。 一方では、XPOを扱っています-シンプルでまだ生きている独自のORMライブラリ(ロシア語コミュニティのレビューからもっと学ぶ: onetwo )、2006年以来XAFの唯一の選択肢であり、膨大な数の例、ドキュメント、ビデオ、開発会社から、そして他の無料保証サポート- 推奨労働市場における開発者のより多くの、マイクロソフトから良い振興と発展のためのサポートについて 、Bと.NETのデータにアクセスするためのオープンソース技術のサードパーティ企業ベースではなく、 Naniiとのコミュニティによる技術サポートのStackOverflowSocial.MSDNforums.asp.net (ただし保証クイックレスポンス全く応答なし)。 私たちは新しいユーザー間で調査を実施しましたが、他の多くの点で同等であるため、テクノロジーを選択する際の非常に重要な要素は、保証されたテクニカルサポートの利用可能性です(これは問題や最善の方法に関する質問の場合に役立ちます)多かれ少なかれいくつかの機能があります。 技術的には、正式にEFがXPOよりもXPOによってサポートされるという事実を考慮しない場合-2012年以降、XAF自体とそのモジュールのレベルでの2つのライブラリのサポートは、機能と対象シナリオで同等です。 現時点では、EFユーザーの割合は増えていますが、それでもXPOよりはかなり劣っています。 EF 7のリリースと、私たちの側での例の存在の調整は、この比率を変更するようです。 このトピックに関するユーザーからのより多くの考えとフィードバックは、私のトピックブログで見つけることができます。





EF 6で新しいXAFソリューションを作成する手順



0.当社のWebサイトからDevExpress Universalの試用版をダウンロードし、インストールが成功するまで待ちます。



1. Visual Studioを開き、標準のFILE |を介してDXLibraryV2という名前の新しいプロジェクトを作成するためのウィザードを開始します。 新規| Project ... 、検索を使用してXAF Solution Wizardを選択します (または最初に特別なメニューを呼び出します :DEVEXPRESS | All Platforms | New Project ...)

(表示...)




2.開いたウィザードで、 WindowsおよびWebプラットフォームを選択し、[ 次へ ]をクリックします

(表示...)




3. Entity Framework Code Firstを選択してデータにアクセスし、[ 次へ ]をクリックします
(表示...)




4. 認証= Active Directoryを選択します。これは、現在のWindowsユーザーを使用してアプリケーションを入力することを意味し、[次へ]をクリックします。
(表示...)




5. [ 完了 ]をクリックして作業を終了します。今のところ、追加のモジュールは必要ありません。
(表示...)






作成されたXAFソリューションの主要部分



その結果、ウィザードは、以前に選択された設定に従って、将来のアプリケーションのために空白を作成します。







簡単に言うと、次のことを行いました。



便宜上、プロジェクトには、初心者が迷子にならないようにするための読み上げ名とreadme.txtファイルを含むサブフォルダーが含まれています( 詳細... )。



今すぐVisual StudioからDXLibraryV2.WebとDXLibraryV2.Winを実行すると、CRUDユーザー管理、ロール、およびセキュリティ設定を除いて、特別なトレーニングを受けていないWebブラウザー*およびWindowsデスクトップ用の動作中のアプリケーションが得られます。 1分あたりのシンプルな管理パネル:









*この図の時点で、上の図のように新しいWebスタイルを有効にするには、 WebApplication.SwitchToNewStyleメソッドをSession_Startに追加する必要があります。 これは将来必要ありません。



次に、この基本的な機能がどのようになったのか、どのような機能があるのか​​、EFがここに隠した場所、そしてニーズに合わせて将来どのように修正できるのかを考えてみましょう。



EF統合の機能



まず、XAFのメインEFサポートは、 DevExpress.ExpressApp.EF.v15.1.dll (.NET 4.0用)およびDevExpress.ExpressApp.EF.45.v15.1.dll (.NET 4.5用)のビルドに実装されています。 .NET Frameworkのバージョンに応じて、XAFプロジェクトで自動的に参照されます。 プロジェクトの作成にウィザードを使用すると、必要なすべてのEF依存関係が自動的に追加されます。 そうでない場合は、 NuGetを使用して標準的な方法でいつでもプロジェクトに追加できます。



執筆時点では、最新のXAFバージョンはEF 6をサポートしており、 DbContextを使用したコードベースの戦略と、 ObjectContextおよびEntityObjectに基づく古い戦略の両方をカバーしています(古いバージョンではEF 5もサポートしています)。 統計によると、ユーザーの間では、データモデルの開発に対する後者のアプローチの人気は最初のものよりもはるかに劣っており、 次世代のEFでEDMXが殺される可能性があるという噂の後私はそれが無駄になると思います。 現時点では、絶え間ない変更のため、最新のEF 7ベータ版の公式サポートはありませんが、この方向での作業は既に進行中です。 EFの新世代自体には、私たちとユーザーにとって多くの興味深い機能が既に含まれており、非常に有望に見えます。



技術的には、 EF Code Firstを使用することは、データモデルの構造を定義するPOCOビジネスクラスと、データベースから要求できるDbSetビジネスエンティティの型付きコレクションの必要なセットを含むDbContext後継者が必要であることを意味します。 5番目のステップでユーザー認証のタイプ(AuthenticationActiveDirectory)を選択し、それによって組み込みのセキュリティモジュール(SecurityModule)をアクティブ化したことをまだ覚えていますか? したがって、この結果、プロジェクトウィザードは、後続のDbContext( DXLibraryV2.Module \ BusinessObjects \ DXLibraryV2DbContext.cs )に含まれています。オプションのDevExpress.Persistent.BaseImpl.EFライブラリで宣言された必要な組み込みエンティティUser、Role(およびその他のサービスパーツ) .v15.1 。これは標準のXAFパッケージの一部として提供され、典型的なケース用に事前定義されたクラスが含まれています。







上記のエンティティは、ある種のデータ構造とロジックを定義する完全に普通のPOCOクラスです。たとえば:







次に、WebApplicationの子孫( DXLibraryV2.Web \ WebApplication.cs )またはWinApplicationのデータへのアクセスを設定するときに、ユーザー定義タイプのDbContextまたはObjectContext(EDMX戦略の場合)と実行可能アプリケーションの構成ファイルから取得したデータベースへの選択された接続文字列がEFObjectSpaceProviderに転送されます( DXLibraryV2.Win \ WinApplication.cs )。



public partial class DXLibraryV2WindowsFormsApplication : WinApplication { public DXLibraryV2WindowsFormsApplication() { InitializeComponent(); } protected override void CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args) { args.ObjectSpaceProvider = new EFObjectSpaceProvider( typeof(DXLibraryV2DbContext), TypesInfo, null, args.ConnectionString ); }
      
      





WxxApplicationクラスは、各プラットフォームおよび関連サービスの実行可能アプリケーションです。 インスタンスは、アプリケーションの入力ポイントで実行するたびに作成および構成されます。たとえば、DXLibraryV2.Web \ Global.asax.csのSession_Startメソッドや、DXLibraryV2.Win \ Program.csのMainメソッドなどです。 必要なアプリケーション設定には、セキュリティシステムコンポーネントと接続文字列に加えて、DXLibraryV2Module( DXLibraryV2.Module \ Module.cs )など、サードパーティと独自のモジュールの両方で構成できる依存モジュールのリストがあります。 XAFモジュール( ModuleBaseの子孫)は、アプリケーション自体( XafApplicationの子孫)と同様に、ビジュアルデザイナーも利用できるSystem.ComponentModel.Componentのカスタム派生物です。







特に、アプリケーションの最初の起動では、ウィザードは、 ModuleUpdaterの子孫の UpdateDatabaseAfterUpdateSchemaメソッド( DXLibraryV2.Module \ DatabaseUpdate \ Updater.cs )でテストデータセットをエンコードしました。これは、EF データベース初期化子の Seedメソッドに類似しています







ModuleUpdaterメソッドと関連コードを開発した結果、フレームワークはMicrosoft SQL Server上に新しいデータベースと、エントリを持つ対応するテーブルを作成しました。







EFObjectSpaceProviderは、コードベース戦略またはEDMX戦略の選択に関係なく、ObjectContext APIと連携します。これは、EF 6のDbContext内にはIObjectContextAdapterへのキャストを通じてアクセスできるObjectContextがまだ含まれているためです 。 特に、MetadataWorkspaceを使用して、ユーザーインターフェイスのCRUDスケルトンをさらに構築するために、型とその構造に関する情報を反映します。



上記のModuleUpdaterのコードサンプルからわかるように、XAF CRUDのコンテキストでは、DbContext / ObjectContextを通じて直接実行するのではなく、この抽象IObjectSpaceエンティティ、またはこの場合はEF- EFObjectSpaceの特定の実装を通じて実行することをお勧めします。 前述のEFObjectSpaceProviderによって提供され、 ObjectStateManagerおよびCreateQuery APIを内部的に使用してデータを変更または読み取ります。 実際、IObjectSpace は、リポジトリおよび作業単位パターンの ORMに依存しない実施形態であり 、技術的にはデータコンテキストの単なるラッパーです。 IObjectSpace APIを使用して 、何らかのビジネスロジックを記述し 、変更せずに別のORMに移行できます。 さらに重要なこととして、IObjectSpaceを介して、XAFフロントエンドはデータと対話します。たとえば、データを受信するか、変更を「リッスン」し、それに応じて自身を更新します。



将来のための実用的なメモ



1.テストデータベースを使用するアプリケーションの開発およびデバッグ中に、構造を絶えず編集した後、System.Data.Entityの組み込みAPIを使用してデータベース初期化子を作成することにより、EF機能Code First Migrations機能を一時的に無効にすると便利です (たとえば(DXLibraryV2.Module \ Module.cs):

 // Uncomment this code to delete and recreate the database each time the data model has changed. // Do not use this code in a production environment to avoid data loss. // #if DEBUG // Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DXLibraryV2DbContext>()); // #endif
      
      







2. DevExpress.Persistent.BaseImpl.EF.v15.1の組み込みのユーザー、Roleクラスを使用する必要はありませんこれは主に初心者がすぐに開始するために必要です。 XAFは最終製品ではありません。まず、アプリケーションを構築するための柔軟で拡張可能な*フレームワーク*であり、必要なスペアパーツをいつでも自分のものに交換したり、何をどのように知っている場合はすべてをゼロから始めたりすることができます。 そのため、たとえば、組み込みのセキュリティパーツの代わりに、EFドキュメントに従ってエンティティを簡単に宣言し、DbContextに追加できます。



3.多くの標準シナリオの通常の操作では、ビジネスクラスにINotifyPropertyChangedサポートを実装することをお勧めします(少なくとも、手動で、少なくともコンパイル時に目的の実装を自動的に挿入するこのようなユーティリティを使用します)。 または、特別なIObjectSpaceLinkインターフェイスを実装し、ObjectSpace.SetModified(this)を手で呼び出して、適切な場所での変更に関する通知をトリガーできます。



4.経験から、顧客は、個別のコントローラーまたはサービスを実装する代わりに、EFクラス自体にビジネスロジックを直接配置することができます。 それらを禁止する権利はありません(貧血モデルとStackOverFlowの豊富なホリバーのトピックについては、 ここに 5セントも投げたのを覚えています )。そのような場合は、前述のIObjectSpaceLinkに加えて、IXafEntityObjectインターフェイスが便利で、作成時のロジックの作成が容易になります(OnCreated) 、読み込み(OnLoaded)およびエンティティの保存(OnSaving)。



5. ASP.NET MVCプロジェクトのEFクラスの既製ライブラリがまだある場合は、現時点では、DisplayFormat、UIHintなど、インターフェイスの外観に影響を与える標準のデータ注釈属性のサポートが制限されていることを知っておくことが重要です。 同時に、EntityFramework.dll、System.ComponentModel.DataAnnotations.dll、およびEF自体の動作に影響を与える他のシステムアセンブリの標準属性は、たとえばStringLength、NotMapped、ComplexTypeなど、正常に機能します。 それはともかく、XAFにはすべての味と色の普遍的な属性がたくさんあるので 、簡単な場合にUIと関連ロジックの構成を高速化できます。 将来を考えると、一般的に、このようなタスクにはアプリケーションモデルを使用することをお勧めします( ここで詳細を説明しました)。



結論として



これらはおそらく、この段階で知る必要があるXAFでのEF統合のすべての主要な機能です。 eXpressAppフレームワーク > 概念 > ビジネスモデルデザイン > Entity FrameworkeXpressAppフレーム ワーク使用 したビジネスモデルデザイン >入門>基本チュートリアル (フレームワークと基本的なアプローチに関する情報も含まれています)のオンラインドキュメントで理解を深めることができます。 XCRM、EFDemoCodeFirst、EFDemoModelFirstのデモも役立ちます。これらは%Public%\ Documents \ DevExpress Demos 15.1 \ Components \ eXpressApp Framework \にあり、ほとんどすべてのフレームワークモジュールとの統合を示す非常に複雑で完全なアプリケーションです。 テクニカルサポートナレッジベースの多数の例と回答も、言及する必要はありません。



次のシリーズでは、既存のデータベースからEFデータモデルを直接作成し、元のプロトタイプアプリケーションの基本ロジックも実装します。



よろしく、

デニス



PS



当社の製品に興味があり、無料試用期間中にそれらをより詳細に調査した後、それらを購入したい場合、2015年12月20日まで包括的に、10%の無利子の償還金(現在の為替レートで〜220ドルまたは〜14,000ルーブル)を使用できますDevExpress Universalライセンス。XAF および一般的なプラットフォーム向けのその他の開発ツールが含まれています。 これを行うには、Softline.ruストア移動し、注文後に必要があります

特別なフィールドにコードを入力してください
Universal_XafEf



CISのロシア語圏コミュニティの利益のためにこの行動に迅速に同意できたことに、再販業者に感謝します。 私たちのサイトから通貨で直接購入することが突然便利になった場合、同様の割引を受けるには、この投稿へのリンクを記載したメールを書いてください 。 そこでXAFに関する質問や要望を送信したり、起こりうる問題について通知したりできます。



All Articles