セッションフォロー(TechEd T2-405 Part4 & 9/18 TechFildersセミナー)
すみません御報告が遅くなりました。TechEdと先日のTechFildersセミナー(9/18)のフォローです。
TechEdでは、Visual Studio 2010が不慮の事故で落ちてしまい中途半端になってしまった箇所です。
9/18では時間が足りなく、「続きはブログで」と言ったら、アンケートでお叱りを受けましたので、次回からはセッションに絶対納めるようにします、申し訳ありませんでした。
シナリオ.~ 汎用性を考慮するには? ~
この方向性としては、Persistence Ignorance をシステムアーキテクチャとして取り入れてみることを考えてみたいと思います。
Persistence Ignorance とはデータの永続化に対して、特定のテクノロジーやプロダクトに依存しないことをさしています。
詳細はこちらから
https://msdn.microsoft.com/ja-jp/library/dd456853(VS.100).aspx
井上のブログでも紹介しています
https://blogs.msdn.com/daisukei/archive/2009/06/02/visual-studio-2010-ef4-poco-part1.aspx
Persistence Ignoranceの想定される使用シナリオとして代表的なものは、以下のスライドにある記述などがあげられます。
例えば、システム設計として、ModelFirstで考える場合、当然生成物は一般的なクラス(図)になるでしょうから、PIシナリオが適していると言えます。
しかし、ModelFirstは手段であり目的ではありません。なぜModelFirstを行うか?になると別の話題になってきますので、今回は、まず身近な目的で考えて見ましょう、例えばEFでサポートされないデータストアの使用を、将来的に実装したいなどが考えられるのではないでしょうか?
と言うことで、セッションでは、ストアとしてXMLとMS-AccessのMDBファイルを使用して、PIシナリオとして、これらを切り替えてみました。(TechEdでは、その最中にVSが落ちたわけですが・・・)
PIを実現するためには、エンティティが特定のプロダクトやテクノロジーに依存しないことが条件になります。しかし、現状のADO.NET EntityFrameworkでは、エンティティの実装(EDM)として、どうしても特定インタフェースを継承しなければなりません。
この話はよくしますが、確認方法としては、前々回でもご紹介した以下のツールを使用して、手動でEFを使用した環境を構築します。
EDM ジェネレータ (EdmGen.exe)
https://msdn.microsoft.com/ja-jp/library/bb387165.aspx
具体例は以下が分かりやすいかと思います。
Entity Framework プロジェクトを手動で構成する方法
https://msdn.microsoft.com/ja-jp/library/bb738546.aspx
ここで作成した、CSDL、SSDL、MSL、CS(VB)のコードを用いて環境を作成します。(下図)
さて、上記のCS(VB)のコードファイルをダイエットしていくと、最終的に以下のようなコードと向き合うことになります。(例はNorthwindデータベースのProductsエンティティです)
[EdmEntityTypeAttribute(NamespaceName = "NorthwindModel", Name = "Products")] public partial class Products : IEntityWithChangeTracker ,IEntityWithKey , IEntityWithRelationships { [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] public int ProductID { get; set; } [EdmScalarPropertyAttribute()] public string ProductName { get; set; } [EdmScalarPropertyAttribute()] public System.Nullable<int> SupplierID { get; set; } ~後略 |
現バージョンのEFのエンティティとして使用するためには、上記のコードにある、IEntityWithChangeTracker ,IEntityWithKey , IEntityWithRelationships あたりが必要になってくると言うわけです。(エンティティに実装する機能によって必要なインタフェースが変わります)
そこで、こうした記述を排除する方向でPOCO(Plain Old CLR Objects)でのクラスを実装することがPIでは必要になります。
上述した井上のサイトでも、EFの次バージョンを使用したPOCOクラスの実装を紹介していますが、小高は、以前ご紹介したEFのCTPを用いてデモを行っています。
ちょっと長くなってきました(前回が長すぎました・・・)ので、次回の記事でデモを簡単にご紹介したいと思います。