web-dev-qa-db-ja.com

エンティティフレームワークとレイヤー分離

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;
    }
}

何をすべきか?

12
Thomas

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

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

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

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

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

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

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

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

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

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

2
sq33G

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

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

リラックスした階層化アプリケーションは、コンポーネントが下位層のコンポーネントと相互作用できるように制約を緩めます。

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

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

結論:中間層が必要ない場合は、それを失います。すべてのアプリケーションが同じアプローチを必要とするわけではなく、レイヤー化の目的でのみレイヤーを追加すると、複雑さのコストとメンテナンスに不利益が生じます。

2
omarqa