Entity Frameworkとレイヤー分離


12

Entity Frameworkを少し使用しようとしていますが、レイヤーの分離に関する質問がありました。

私は通常UI-> BLL-> DALアプローチを使用しますが、ここでEFを使用する方法を知りたいです。

私のDALは通常、次のようなものです

GetPerson(id)
{
    // some sql
    return new Person(...)
}

BLL:

GetPerson(id)
{
    Return personDL.GetPerson(id)
}

UI:

Person p = personBL.GetPerson(id)

私の質問は、EFが私のモデルとDALを作成するので、EFを自分のDAL内にラップするのは良い考えですか、それとも時間の無駄ですか?

EFをラップする必要がない場合でも、Model.esmxを独自のクラスライブラリ内に配置しますか、それともBLL内に配置してそこで作業するだけでいいでしょうか?

EFを自分のDAL内にラップする理由は実際にはわかりませんが、他の人が何をしているのか知りたいです。

したがって、上記の代わりに、DALを除外して、次のようにします。

BLL:

GetPerson(id)
{
    using (TestEntities context = new TestEntities())
    {
            var result = from p in context.Persons.Where(p => p.Id = id)            
                    select p;
    }
}

何をすべきか?

回答:


13

提供する例は、ほとんど階層化されたアーキテクチャではありません。私はそれが意図的に簡素化されていることを知っていますが、:

プレゼンテーションレイヤーは、Personエンティティに直接結び付けられています。これは最も単純な場合にのみ問題ありません。レイヤーを定義しようとしているときは間違いありません。

GetPersonメソッドは、呼び出しごとに新しいコンテキストを作成するというかなり悪い習慣も使用しています。コンストラクターでコンテキストを取得する必要があり、コンテキストはIOCコンテナーによって提供されます。

私が使用したシンプルで効果的な構造は次のとおりです。

  • Project.Core-ビューモデルとインターフェイスが含まれています。
  • Project.DAL-EDMXと生成されたコード。
  • Project.BLL-ビジネスロジック。
  • Project.Web-Webアプリ自体。

次のことに注意することが重要です。

  • コアは他のソリューションに依存していません。
  • DALは他のソリューションに依存しません。
  • Project.WebはCoreに依存していますが、DALやBLLには依存していません。
  • BLLはCoreとDALに依存しています。

1
コアはビジネスオブジェクトレイヤーのように見えます。
sq33G

これも私が使用しているものとほぼ同じですが、インターフェイス宣言に対応するために余分なDLLを追加します。この方法では、インターフェイスのみを参照し(DIの場合は[url = unity.codeplex.com/]Unity[/url]のようなものを使用します)、誤って誘導した奇妙な依存関係がないことを確認できます。
エドジェームズ

通常、EFなしで「モデル」レイヤーに独自のPersonクラスを作成するため、UI、BLL、DAL、およびモデルがあります。UIはBLLとモデルを知っています。BLLはDALとモデルを知っています。DLLはモデルを認識しています。独自の「ビューモデル」も作成しますか。EFが生成するモデルを使用しないのですか。(これは階層化アーキテクチャに反することは知っていますが、実際にデータを取得する方法を何回切り替えるのですか?)
Thomas

で、ビューモデルを包む@Thomas 何かの抽象は、はるかに簡単というユニットテストを行います。
sq33G

3
モデル!=ビューモデル
ボリスヤンコフ

2

EDMXをラップする必要はありません。

EFから他のアプローチに変更する必要がある可能性が予測できる場合は、ビジネスオブジェクトを拡張して(部分クラスを利用して)別のビジネスオブジェクトレイヤーで定義されたインターフェイスを実装することができます。

次に、コードからこれらのインターフェイスのみを処理し、具体的な生成クラスを処理しません。これをまとめるには、小さなグルーコードが必要になる場合があります。EDMXを使用するとDALになります。


したがって、EFから別のアプローチへの変更を一切考慮しない場合、上記のコードは大丈夫でしょうか?その場合、UIとBLL(EDMXがBLLにある場合)のみがありますか?
トーマス

私の実際的な答えはイエスです。EDMXが大きく、大部分が静的である場合は、実際にEDMXをそれ自体の小さなアセンブリに配置する必要があるかもしれないという警告があるので、頻繁に再コンパイル/再配布する必要はありません。
sq33G

ああ、再コンパイル/再配布についての良い点:)
トーマス

2

階層化には、厳密な階層化とリラックスした階層化の2つの一般的なアプローチがあります。

厳密に階層化されたアプローチでは、1つのレイヤー内のコンポーネントが、ピアおよびその直下のレイヤーとのみ対話するように制限されます。

リラックスしたレイヤー化されたアプリケーションは、コンポーネントが下位レイヤーのコンポーネントと対話できるように、制約を緩めます。

リラックスレイヤリングを使用すると、システムが1つのレイヤから次のレイヤに単純な呼び出しを転送する必要がないため、効率が向上します。一方、リラックスレイヤリングを使用すると、レイヤ間で同じレベルの分離が提供されず、上位レイヤに影響を与えずに下位レイヤをスワップアウトすることがより困難になります。

多くのソフトウェアコンポーネントを含む大規模なソリューションでは、同じレベルの抽象化された、凝集性のないコンポーネントが多数存在するのが一般的です。この場合、各レイヤーはさらに1つ以上の凝集サブシステムに分解されます。図2は、複数のサブシステムで構成されるレイヤーを表すための可能な統一モデリング言語(UML)表記を示しています。

結論:中間層を必要としない場合、それを失います。すべてのアプリケーションが同じアプローチを必要とするわけではなく、階層化のためだけに層を追加すると、複雑さのコストとメンテナンスにペナルティがかかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.