2015-10-09 2 views
5

ASP NET 5/EF 7アプリケーションでリクエストごとに1つのコンテキストを取得して、一部の方法(コントローラではない)で使用したいと考えています。どのようにコントローラからのASP NET 5のEF7現在のデータベースコンテキストを解決するには?

残念ながら、私は、マニュアルで ASP.NET vNext templateと例が答えを見つけられませんでしたaspnet/MusicStore

+0

これらのいくつかのメソッドをあなたのコントローラから呼び出すつもりはありませんか?リクエストごとにコンテキストを取得し、それを 'some methods'に渡すことができます。 – Michael

+0

快適ではない、複数の通話がある可能性があります。 MVC5のアプリではPerRequestLifetimeManagerでUnityDependencyResolverを使用しました。私はここに似たようなことをしようとしています –

+0

それはあなたが必要とするものを正確に実行しようとしています - 要求ごとにDbContextを作成し、それをあなたのコントローラに注入します。詳細については、[このブログの投稿](http://www.jerriepelser.com/blog/resolve-dbcontext-as-interface-in-aspnet5-ioc-container)を参照してください。 – Michael

答えて

6

あなたは、この目的を達成するためのいくつかの方法を使用することができます。

ConfigureServices()方法で)依存性注入システムでApplicationDbContextを登録するための.AddDbContext<ApplicationDbContext>();方法を使用して、それがスコープ依存性(または「要求ごと」別の言葉で)として登録されているという事実につながります。これにより、依存性注入システムから取得するだけで済みます。

  1. あなたのクラス(dbContextを使用する)のコンストラクタメソッドのパラメータとしてdbContextを追加します。次に、Dependency Injectionシステムを使用してこのクラスを取得する必要があります。たとえば、コントローラのコンストラクタのパラメータとして追加します。あなたは、コンテキストを取得するためにコンストラクタ・インジェクションを使用しない場合

    public class HabitsController : Controller 
    { 
        public HabitsController(HabitService habitService) 
        { 
    
        } 
    } 
    
    public class HabitService 
    { 
        private GetHabitsContext _dbContext; 
    
        public HabitService(GetHabitsContext dbContext) 
        { 
         _dbContext = dbContext; 
        } 
    } 
    
  2. しかし、あなたはGetService()メソッドを使用して、必要なdependensesを得ることができます(ただし、あなたはそれを取得し、以下の例では、そのためのServiceProviderインスタンスにi'amを必要としますコンストラクタインジェクションを通しても)。第1の方法では

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below 
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above 
    public class HabitService 
    { 
        private IServiceProvider _serviceProvider; 
    
        public HabitService(IServiceProvider serviceProvider) 
        { 
         _serviceProvider = serviceProvider; 
        } 
    
        public GetHabit() 
        { 
         var dbcontext = _serviceProvider.GetService<ApplicationDbContext>(); 
        } 
    } 
    
  3. 、我々は(ないコンストラクタ・インジェクション経由)あまりにGetService()メソッドを介してHabitServiceを得ることができます。

    using Microsoft.Framework.DependencyInjection; // for beta 6 and below 
    using Microsoft.Extensions.DependencyInjection; // for beta 7 and above 
    
    public class HabitsController : Controller 
    { 
        public HabitsController(IServiceProvider serviceProvider) 
        { 
         var habitService= serviceProvider.GetService<HabitService>(); 
        } 
    } 
    
    public class HabitService 
    { 
        private GetHabitsContext _dbContext; 
    
        public HabitService(GetHabitsContext dbContext) 
        { 
         _dbContext = dbContext; 
        } 
    } 
    

おかげツェン発言用:

私はそれがあなたのオブジェクトにコンテナを注入するかなり悪い習慣だということに留意すべきです。容器は、組成物の根及び(アプリケーションレベルではなく、ドメイン/ビジネスレイヤに実装されている)工場の特定のタイプHabitServiceでHabitsControllerと_dbContextで


dbContextからのみ参照されるべきです異なる文脈です!

これは同じコンテキストです。

+0

あなたはそうだ、それはうまくいく、ありがとう –

+1

私は、オブジェクトにコンテナを注入するのはかなり悪い習慣であることに注意すべきである。コンテナは、コンポジションルートと特定のタイプのファクトリ(ドメイン/ビジネスレイヤではなく、アプリケーションレベルで実装されている)からのみ参照する必要があります。 – Tseng

+0

@Tsengそうです!私は自分の答えが正しいと思っています。 –

関連する問題