0

私のdbcontextをweb api 2プロジェクトのサービスに挿入したいと思います。しかし、私はそれをどうやって行うのか少し不明です。私はドキュメントを読んだことがありますが、ライフサイクル、スコープ、要求、ネストされたコンテナ...彼らはすべて私に少しわかりません。私は、私の最善の理解から次のコードをまとめました。 NugetパッケージStructureMap.WebApi2をインストールした後、SMをv3からv4に、SM.MVC5をv3からv4に更新しました。StructureMapとWebApi2を使用してdbcontextを挿入する方法

次のコードは、http要求ごとに1つのdbcontextを使用したいという効果があるようです(スコープについては混乱しています)ので、同じdbcontextがすべてのサービスで共有されますユーザーのトランザクションを処理し、トランザクション(http要求)が閉じられたときに廃棄します。しかし、外見は必ずしも正しいとは限りません。

IoC.cs

public static IContainer Initialize() 
    { 
     var container = new Container(_ => 
     { 
      _.AddRegistry<DefaultRegistry>(); 
      _.ForConcreteType<MyDbContext>().Configure.ContainerScoped(); 
     }); 
     DomainEvents.Initialize(container); 
     return container; 
    }} 

DefaultRegistry.cs:

public DefaultRegistry() 
    { 
     var mapperConfig = new MapperConfiguration(cfg => 
     { 
      cfg.AddProfile(new Common.Map.MapProfile()); 
      cfg.CreateMissingTypeMaps = true; 
     }); 
     var mapper = mapperConfig.CreateMapper(); 
     For<IMapper>().Use(() => mapperConfig.CreateMapper()); 
     For<MyDbContext>().Use(()=> new MyDbContext()); 

     Scan(
      scan => 
      { 
       scan.AssemblyContainingType<ServiceBase>(); 
       scan.TheCallingAssembly(); 
       scan.WithDefaultConventions(); 
       scan.ConnectImplementationsToTypesClosing(typeof(IHandle<>)); 
      }); 
    } 

NugetパッケージStructureMap.WebApi2は解像度とネストされたコンテナを配線するためのいくつかの他のファイルを作成したが、私はそれらを残していますこの質問の簡潔さのために。

答えて

0

Mehdime DbContextスコープファクトリ/ロケータ:https://github.com/mehdime/DbContextScopeを参照してください。彼は自分のブログでそれを少し詳しく説明しています。 (プロジェクトの説明にリンクされています)最新のEFバージョンに更新されたフォークがあります。

私は、EFコンテキストの作業ラッパーの優れた単位であることがわかりました。これらのコンテキストを直接注入または渡すことを心配する必要はありません。

IoCコンテナとコンストラクタインジェクションの問題点は、DBContextを登録すると、要求範囲内の作業単位のようなもので動作することが難しいことです。 DbContext Scopeは、Scope FactoryとScope Locatorをコンテナに登録することでこれを解決します。スコープ(作業単位)を制御するコードは、スコープファクトリを使用してDbContextのコンテキストスコープを初期化します。 DbContext内のDbSetsなどで動作するコードは、ContextScopeLocatorを使用してUbuntuを取得します.DbContextは&です。

+0

これまで見てきましたが、もう一度見ていきます。私の最初の反応は、私がウェブ環境にいるので、私の使用の大半はリクエストごとに1ユーロになるということです。これまでのところ、同じリクエスト内で2番目のdbcontextをスコープする必要はありませんでした。これは私が最終的に採択する良い代替提案かもしれませんが、残念ながら、上記のコードが正しいかどうかについて私の質問に答えることはできません。 –

関連する問題