アーキテクチャ的に言えば、MicrosoftのEntity Frameworkなどのデータベース抽象化レイヤーは、別のデータアクセスレイヤーの必要性を無効にしますか?


11

そうだった

長年にわたって、ソフトウェアソリューションを次のように整理してきました。

  • データにアクセスするビジネスを抽象化するデータアクセス層(DAL)
  • ビジネスルールをデータセットに適用したり、認証を処理したりするためのビジネスロジックレイヤー(BLL)
  • ユーティリティ(Util)は、私が長年にわたって構築してきた一般的なユーティリティメソッドの単なるライブラリです。
  • もちろん、Web、デスクトップ、モバイルなど何でもよいプレゼンテーション層。

今のやり方

過去4年ほどの間、私はMicrosoftのEntity Framework(私は主に.NET開発者です)を使用しており、Entity Frameworkが既に行っているという事実のために、DALがクリーンよりも厄介になっていることに気付きました私のDALが使っていた仕事:データベースに対してCRUDを実行するビジネスを抽象化します。

したがって、通常、次のようなメソッドのコレクションを持つDALになります。

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

次に、BLLでは、このメソッドは次のように使用されます。

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

BLLには通常、さらに数行のロジックが適用されるため、これはもちろん簡単な例ですが、そのような限られた範囲でDALを維持するのは少し過剰に思えます。

DALを放棄して、単にBLLメソッドを次のように記述する方が良いと思いませんか。

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

上記の理由により、将来のプロジェクトからDALを削除することを検討していますが、そうする前に、プロジェクトを開始して問題を発見する前に、後知恵/先見/意見についてコミュニティに投票したいと思いました」予想する。

どんな考えでも大歓迎です。

更新

コンセンサスは、別個のDALは必要ではないが、ベンダーロックインを回避するために(ここで独自の推論を行う)ことをお勧めします。たとえば、他のベンダーに切り替えて、BLLを書き換える必要はありません。DALの基本的なクエリのみを書き換える必要があります。そうは言っても、これが起こるシナリオを想像するのは難しいと思います。私はすでにOracle dbのEFモデルを作成できます。MSSQLは与えられています。MySqlも可能だと確信しています(??)ので、余分なコードが価値のあるROIを与えるかどうかはわかりません。


3
データアクセスレイヤーとEFの違いは何ですか?EFはデータアクセス層ではありませんか?私はあなたのビジネスロジックとEFの間で独自の抽象化を維持するために見ることができる唯一の理由はでテストするためと回避ベンダーロックに簡単にスタブにすることです。
マージャンVenema氏

2
それが私のポイントです-私の見解に違いはありませんが、私はカウンターポイントを探しています。ありがとう。
マットキャシャット

3
EF / NHibernateはそれ自体がデータアクセスレイヤーであるため、個人的には別個のDALを作成する理由はありません。Marjanが述べたように、EFを使用すると、データベースベンダーの変更を確認できれば検討できます.NHibernateでは、ドライバーを1行のコード(メモリ内テスト用のSQLiteドライバーでも)に交換できるため、(IMO)不要なコードになります。
パトリクシヴィーク

3
2つのDALを持つ必要はありません。他の人が述べたように、BLLを保持しますが、ベンダー固有の構造にBLLをロックしないように注意してください。私はいつも物事が文字列または整数レベルに達するのを見るのが好きです。それから、Webサービス、シリアルポート、電信リンク、冗談のような非常に原始的なチャネルで、BLL / DALジャンクション全体を簡単に公開できることを知っています。
アンディズスミス

1
更新:この追加のレイヤーは、のモック/スタブ/フェイクがのモック/スタブ/フェイクGetMyObjects(int myId)よりも簡単であるため、busineslayerのUnittestsをはるかに簡単にすることができGetObjects.Where(ob => op.accountId == myId).ToList()ます。
k3b

回答:


6

これがあなたが探している答えであるかどうかはわかりませんが、ここに行きます。

物事を分離/整理するためにそれを行います。はい、EF / NHibernateはデータアクセスです。このアセンブリには、NHibernateマッピング、セッションファクトリ、複数のデータベースを処理するためのコードなどもすべて含まれています。

アセンブリ全体がORMをサポートするために存在するため、これを「データアクセスレイヤー」と呼びます。

メインアプリは5つのデータベースを参照し、約4〜500のドメインオブジェクト/マッピングとさまざまなスキーマを持っていることに注意してください。したがって、このセットアップは私たちにとって理にかなっています。おそらく、より小さなアプリの場合、このアセンブリをスキップするでしょう。


2

EFとDALは、エンタープライズシステムの個別のコンポーネントと見なしています。データアクセス層は、他のサービスがデータの永続化と管理を実行するために使用する抽象化です。通常、Entity Frameworkは、クエリ、更新、削除、および挿入に関する優れたAPIを構築しますが、コアでは、バックエンドデータソースへの直接接続が必要です。したがって、どのタイプのルーティングまたはファイアウォールもEFの機能を停止するため、EFメディエーションコンポーネントを作成する必要があります。

DALとEFが適合する場所を示す高レベルの例は次のとおりです。

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

私の経験では、ビジネスロジックやサービスの実装がEFレイヤーに直接アクセスすることを許可しないほうが良い設計だということです。代わりに、すべての永続データを操作するための抽象化を提供することにより、ネットワーク経由でリクエストを送信したり、ローカルでリクエストを実行したりできます。

ただし、この設計では、いくつかの漏れやすい抽象化が導入されています。そのため、ケースバイケースで検討する必要があります。

尋ねるべき質問:

  • データにアクセスするすべてのコンポーネントは、バックエンドデータストアへの接続を取得できますか?
  • EFでは、さまざまな種類のデータストアのデータセットを集約できますか?たとえば、ドキュメントにMongoDBでSQLデータベースを使用します。

1

今日、データストレージを変更するかどうかの質問は、MS SQLとOracle SQLの間でスワップするかどうかだけではなく、さまざまなNoSQLデータストレージ製品をデータリポジトリとして使用できます。

そのような変更の重大な可能性があった場合、EFコードをDAL内に隔離しておくと、リポジトリ要求をNoSQLデータベースにマップする新しいDALを将来導入できるようになる可能性があります。とにかく、db関連の仮定が当然忍び寄るので、そのような変更は最終的にBLLの大規模な書き換えになる可能性があります。

同様に、DAL内のEFは、おそらくBLLコードユニットテストのデータアクセスのモックをより簡単にするでしょう。

したがって、私の考えでは、EF(または他のORMS)が必ずしもデータアクセスレイヤーの必要性を無効にするわけではありません。

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