ASP.net 5とEF7でリポジトリはもう必要ですか?


9

EFチームにgithubで質問を投稿しました。ここでこの質問をする方がよいとの返信がありました。コピーしてここに貼り付け、リンクとして他のユーザーがGitHubでいくつかの返信を確認できるようにします。

質問:私はいくつかの調査を行っていましたが、誰かがDBContextクラスの24行目で次のように述べていると指摘しました

DbContextは、作業単位パターンとリポジトリパターンの組み合わせです。

これは、EFをリポジトリーに抽象化し、インターフェースを使用してそれをコントローラーに注入する必要がなくなったことを意味しますか?

Githubの元の投稿:https : //github.com/aspnet/EntityFramework/issues/4899

私がこれを尋ねる理由は、GetById、GetByName、GetWithIncludesABC、GetWithIncludes123などの多くのメソッドをリポジトリに追加しているように見えて、私の心の中でリポジトリを汚しているように思われるからです。


1
rowanmillerの答えをどう思いますか?私には完全に合理的に思えます。
Robert Harvey

@RobertHarveyはい、それは良い答えでしたが、リポジトリを決定する前に、他の人がトピックについてどのように感じているかを確認したいと思います
Loren.Dorez

同様にbogardが主張するlostechies.com/jimmybogard/2009/09/11/wither-the-repositoryも参照してください。
mcknz 2016年

EF(および他のORM)がリポジトリではない理由についての私の見解。
Eric King

リポジトリには、GetWithIncludesABCのようなメソッドはありません。リポジトリパターンは、基本的に、データベーステーブルをコレクションとして抽象化したものです。通常、コレクションを(LINQなどによって)クエリすることが可能で、リポジトリはクエリをSQLに変換します。あなたが話していることは、データゲートウェイのように聞こえます。
Cochese氏2016

回答:


12

あなたがリポジトリにメソッドを追加している場合

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

次にサービス層に移動し、サービス層に EFを直接使用させることをお勧めします。EFには、上記の方法と同様の機能がすでにあり、無限に複製しています。

サービス層はビジネスドメインメソッドを公開し、CRUDを使用してそれらを実装します。たとえばTransferMoney(A, B)、AとBがアカウントをチェックしているというメソッドがあるとします。これにより、サービスドメインがCRUDを処理する一方で、ビジネスドメインの言語を話すことができます。

別のリポジトリレイヤーが必要になると思われる唯一の説得力のある理由は、そのリポジトリレイヤーを模擬したり、テスト目的で別のデータソースを代用したりできるようにするためです。


ただし、dbsetをモックすることはできます... msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
S1r-Lanzelot

4

ロバートハーベイは彼の答えで言った:

別のリポジトリレイヤーが必要になると思われる唯一の説得力のある理由は、そのリポジトリレイヤーを模擬したり、テスト目的で別のデータソースを代用したりできるようにするためです。

これが、リポジトリパターンが依然として関連する理由です。Entity Frameworkチームがリポジトリパターンを実装しているという主張にも同意しません。Entity Frameworkは、依然としてデータベースに非常に密接に関連付けられています。リポジトリパターンの主な目的は、アプリケーションで使用されている正確な永続化メカニズムを分離して抽象化することです。これにより、データアクセスの実装から、リポジトリレイヤーの外に漏れることはありません

ある種のサービスオブジェクトのように、「リポジトリ」の外でEFクエリAPIを使用している場合、パターンを壊していると言えます。

ここで、機能のようなデータベースが他のコードにリークすることは致命的な問題ではなく、将来的に一部のCRUD操作をWebサービスに移動する必要がないことを保証できれば、EFを直接使用することになりますOK。

基本的に、Entity Frameworkは、リポジトリパターンのゲートウェイオブジェクトの代わりをします。私はそれ自体をリポジトリとして見ていません。


リポジトリとサービスレイヤーの違いは何ですか?私がIQueryableを返した場合、本質的にはリポジトリーを返す場合に見つけることができるものからIEnumerableを返した場合、サービス層を使用した場合。これは正しいです?サービス層とリポジトリのパターンは似ていますか?
Loren.Dorez 2016年

@ Loren.Dorez:サービスレイヤーには、などのビジネスドメイン固有のメソッドTransferFunds()ありBuildWidget()ます。リポジトリにはCRUDメソッドのみが含まれています。
Robert Harvey

では、サービスレイヤーとリポジトリの両方がDBContextに直接アクセスするのでしょうか。では、CRUDをRepo、Getメソッド、その他のメソッドをサービスレイヤーに配置しますか?私はこれを正しく理解していますか?
Loren.Dorez 2016年

サービスレイヤーは、EFがある場合は、EFを直接アクセスするのではなく、リポジトリにアクセスします。
Robert Harvey

@RobertHarvey上記のGet Methdsを使用した例を見せていただけますか?今のところ、少し混乱して申し訳ありません。
Loren.Dorez 2016年

1

リポジトリは必要ないようです-マイクロソフトのサンプルバックエンドマイクロサービスアプリケーションではそれらを使用していません。

https://github.com/Microsoft/BikeSharing360_BackendServices

サンプルのBikeSharingアプリがConnect();に表示されました。イベント(APIプロジェクトのテンプレートとして使用できると思います):

https://blogs.msdn.microsoft.com/visualstudio/2016/12/14/connectdemos-2016-bikesharing360-on-github/

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