どのようにコントローラからのASP NET 5のEF7現在のデータベースコンテキストを解決するには?

asp.net-core entity-framework-core

質問

私はいくつかの方法(コントローラではない)でそれを使用するためにASP NET 5 / EF 7アプリでリクエストごとに1つのコンテキストを取得したい。

残念なことに、ドキュメントのASP.NET vNextテンプレートとサンプルaspnet / MusicStoreの答えが見つかりませんでした

受け入れられた回答

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

.AddDbContext<ApplicationDbContext>(); Dependency Injectionシステム( ConfigureServices()メソッド内)にApplicationDbContextを登録する方法は、Scoped依存関係(または別の言葉では「要求ごと」)として登録されているという事実につながります。これにより、依存性注入システムから取得するだけで済みます。

  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()メソッドを使用して必要な依存を得ることができます(ただし、そのためのServiceProviderインスタンスが必要です。

    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;
        }
    }
    

発言のために感謝Tseng:

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


HabitsControllerのdbContextとHabitServiceの_dbContextは異なるコンテキストです!

私はチェックしました、これは同じ文脈です。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ