12

私はプロジェクトに取り組んでおり、DAL を設計する必要があります。Entity Frameworkプロジェクトの大部分と、Dapperパフォーマンスが重要な領域の一部に使用します。

私はリポジトリ パターンを使用することを考えていましたが、EF は何らかの意味でこのパターンを既に実装しています。しかし、Dapper の場合はそうではありません。次に、DAL でリポジトリ パターンとサービス パターンを混在させることは有効でしょうか? それとも、これはビジネス ロジック層に渡りますか?

私が作ろうと思っていたサンプル構造:

MyProjectName.Main
    Views/
    Controllers/
    Infrastructure/
    ...
MyProjectName.DAL
    DataService.EF/
        fileName.cs
        ...
    DataService.Dapper/
        fileName.cs
        ...
4

4 に答える 4

10

Bradley Braithwaiteが作成したEF + Dapper ハイブリッド実装を確認してください。

GitHub リポジトリ: https://github.com/bbraithwaite/HybridOrm

付随するブログ投稿: ORM:車輪を再発明しないでください

「出血」を避けるためにプロジェクトレイヤーを構造化するという点で、彼がそれを行った方法は次のとおりです。

プロジェクトのレイアウト

ブログ投稿から: Dapper を使用したデータ リポジトリの作成

于 2013-11-05T19:08:58.090 に答える
8

EF またはその他の ORM はリポジトリを実装しません。リポジトリは、ドメインを永続性から分離することを目的としています。ドメインはドメイン オブジェクトで動作し、EF/Nhibernate/Dapper などはリレーショナル データベースの OOP ビューを表す永続エンティティで動作します。

違いを見ます?1 つはビジネス オブジェクトを必要とし、もう 1 つはデータ構造を扱います。それらは似ていますが、同じではありません。ドメイン モデルの概念、動作、およびユース ケース。持続性はデータの保存を重視するため、高速に取得できます。異なる責任。リポジトリはそれらの間のメディエータとして機能し、ドメイン オブジェクトを永続構造に「変換」し、その逆を行います。

常に、ORM はリポジトリの実装の詳細です。実際にはドメインを持たない CRUD アプリの場合、データベース、つまり (マイクロ)ORM を直接扱っています。その場合、Repo は、データ アクセスに何らかのビジネス上の意味を与えるためのファサードとしてのみ意味があります ( GetOrdersは、Linq 全体または 5 行の SQL が 3 つのテーブルを結合することを理解するのがはるかに簡単です)。

リポジトリ インターフェイスは必要な場所で定義されますが、Persistence (DAL) で実装されます。サービスと同じように、実装を DAL で行うことができますが、ドメインで (インターフェイスとして) 定義できます。リポジトリの実装はほとんどの場合 DAL の一部ですが、一部のサービスのみが DAL に常駐しています。他のサービスは、リポジトリ (通常はコンストラクターを介して注入される) を直接使用でき、DAL には触れません。

どのようなパターンを使用する場合でも、その実際の目的を理解しようとし、常にデカップリングについて考えてください。

于 2013-11-05T19:50:08.480 に答える
8

あなたの問題は十分に一般的であり、一般的な解決策 - CQRS (Command Query Responsibility Segregation)があると言えます。このパターンは、プロジェクトでDDD (ドメイン駆動設計)を実践していて、 some performance-sensitive areas.

使用する ORM に違いはありません。データを取得するさまざまなコンポーネントがあっても問題ありません。

Repositories または/および Entity Frameworkを使用し、そのすべての機能を使用しmost of the projectC -reate R -ead U -pdate D -elete 操作を実行できます。

ただし、クエリsome performance-sensitive areasを使用できます。これらは、Dapper によって埋められた DTO を返します ( R ead 操作)。

于 2013-11-05T19:16:06.520 に答える