2016-05-27 6 views
3

私は最新のASP.Net Core RC2、Web APIを、Windowsのみを対象としています。フレームワーク4.6.1。依存性注射とスコープ?

標準のリポジトリパターンの役割は、コアがコントローラ依存性注入を処理する方法とは異なります。私はちょうどこれが適切なアプローチであることを確かめたいと思います。そこには多くのドキュメンテーションがありません(または矛盾します)。

私はこれを今設定した方法で、CRUD操作のための標準リポジトリインタフェースと、これらの操作を実装する関連クラスを持っています。

リポジトリをコントローラに注入しています。私が撮影した2つのステップが(Startup.csで、ConfigureServices())は次のとおりです。

services.AddSingleton<IMyCustomRepository, MyCustomRepository>(); 

その後、リポジトリに取っている私のコントローラ:

public MyCustomController(IMyCustomRepository repository) { } 

私の最終目標は含めて、ここでEFコアを得ることですInMemoryProvider。

これはこれまで正しく構築されていますか?私の主な懸念事項の1つは、Entity FrameworkのようなORMを使用する場合、リポジトリパターンが必要ではないことについて常に読んでいますが、これがEFコアにどのように当てはまるかはわかりません。

EFコアを使用している場合は、AddSingletonを使用しないでください。これはScopedのDbContextに依存しているためです(代わりに使用する必要があります)。

答えて

3

アプリケーションでシングルトン動作が必要な場合は、それを使用します。しかし、その場合は、自分でオブジェクトのライフタイムを管理するために が必要になります。 「しかし、Entity Frameworkのコンテキストは は、スコープの寿命を使用して、サービス・コンテナに追加する必要が示すように、あなたはヘルパーメソッドを使用している場合これは、自動的に の世話をされています。」以下:を利用します

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<MyDbContext>(options => 
     options.UseInMemoryDatabase() 
    ) 
} 

リポジトリをEntity Frameworkは同じ有効期間を使用する必要があります。つまり、AddScopedは... だからあなたのコードはそうのようにする必要があります:

services.AddScoped<IMyCustomRepository, MyCustomRepository>(); 

「私の主な懸念の1つは、私は常に、Entity Frameworkのようオームズを使用する場合に必要ではない あるかリポジトリパターンについて読んでいますということです、これがどのようにEFコアに適用されるのかは不明です」あなたのappliationでリポジトリパターンをimplimentすべき

...あなたは

リポジトリパターンが何であるかを読んで、その後、DbContextとDbSetがそれを満たすかどうかを確認する必要があります。

このビデオを見る:https://www.youtube.com/watch?v=rtXpYpZdOzM

+0

ありがとうございます。 'MyDbContext'はリポジトリパターンでどこに"生きている "のですか?私はマップのすべての例を見てきました。私は具体的にCore RC2について知りたいと思っています。これはリポジトリに注入され、メンバとして保存されるはずですか?オンデマンドで 'using()'ブロックで囲まれているのも見てきました。 – Patrick

+0

@Patrick:依存性注入/ IoCコンテナを持つWebアプリケーションで 'using'ブロックを使用するべきではありません。なぜなら、' using'ブロックを離れた後にコンテナが破棄され、例外はある。 ASP。要求が完了すると、.NET Coreは廃棄処理を行います(有効範囲内で登録したと仮定して) – Tseng

+0

@Tseng Agreed。 DbContextはこの設定でコンストラクタ経由でリポジトリに注入され、メンバとして保存されるべきですか? – Patrick