私は依存関係とIoCが初めてであるため疑いがあります。SimpleInjectorを使用してネストされたメソッドでDbContextを取得する方法
私には、(ビジネスロジックを使用する)ドメインレイヤーとデータレイヤーがあります。我々はリポジトリを実装せず、EFコアを直接使用します。 これはクラスライブラリプロジェクトで、AspNetCore Web API、WinForms、および別のフレームワークで使用します。
アイデアは、スコープ内で同じコンテキストを使用することです。
問題は、ネストされたメソッドの実行で同じコンテキストを取得できないということです。概念を完全に理解できなかったことが原因であると確信しています。
例:あなたはその抽象化することにより実装を登録
public class MyTest
{
public void TestContainer()
{
var parentContext = MyContainer.Container.GetInstance<MyContext>();
TestParentAndChildContext(parentContext);
}
private void TestParentAndChildContext(MyContext parentContext)
{
var childContext = MyContainer.Container.GetInstance<MyContext>();
Assert.AreEqual(parentContext, childContext);
}
}
public class MyContainer
{
public static Container Container
{
get { return container ?? (container = RegisterAndVerifyContainer()); }
}
private static Container RegisterAndVerifyContainer()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new ExecutionContextScopeLifestyle();
container.Register<DbContext, MyContext>(Lifestyle.Scoped);
container.Verify();
return container;
}
}
感謝をあなたの知識を共有するため。 – Lucas
あなたの知識を共有してくれてありがとう。 私はまだ多くのことを学ぶ必要があります。私の場合、これは最良の選択肢です。私はプレゼンテーション層へのアクセスが制限されており、ビジネス層とデータ層の下で作業し、いくつかのビジネスルールを実行しながら同じコンテキストを共有する必要があります。すべてのプロジェクトはクラスライブラリです。 ビジネスロジックからGetInstanceを呼び出してグラフを事前に構築できないのはなぜですか? – Lucas
@Lucus:あなたは 'GetInstance'を呼び出しません。すべてのオブジェクトをアプリケーションの起動パス(Compostion Root)に登録します。また、すべてのインスタンスはコンストラクタインジェクションを使用して受信されます。深いオブジェクトグラップを構築します。 – Steven