1

DbContextWinForms アプリケーションで依存性注入を使用して寿命を管理する適切な方法について混乱しています。現在、次のようなコードがあります

static class Program
{
   // This is the main window's controller, which stores all the
   // dependencies that are resolved in the composition root and handles 
   // passing those dependencies to other objects
   private static IMainController mainController;

   private static void ComposeDependencies
   {
      UnityContainer container = new UnityContainer();
      container.RegisterType<IMyContext, MyContext>();
      container.RegisterType<IOrderRepository, OrderRepository>();
      container.RegisterType<IOrderService, OrderService>();

      mainController = new MainController(
         container.Resolve<IOrderService>());
   }
}

public class OrderRepository : IOrderRepository
{
   private readonly IMyContext context;

   public OrderRepository(IMyContext context)
   {
      this.context = context;
   }
}

public class OrderService : IOrderService
{
   private readonly IOrderRepository repository;

   public OrderService(IOrderRepository repository)
   { 
      this.repository = repository;
   }
}

public class MainController
{
   private readonly IOrderService orderService;   

   public MainController(IOrderService orderService)
   {
      this.orderService = orderService;
   }

   public void DoSomethingWithAnOrder()
   {
      FirstTypeOfController controller = new FirstTypeOfController(this.orderService);

      // Show window, assign controller, etc.
   }

   public void DoSomethingElseWithAnOrder()
   {
      SecondTypeOfController controller = new SecondTypeOfController(this.orderService);

      // Show window, assign controller, etc.
   }
}

私が抱えている問題は、このパターンにより、プログラムの開始時にすべてのリポジトリが作成されるため、プログラムMyContext全体でインスタンスが残ります。そのため、プログラムの外部でデータベースが更新されるMyContextと、既にロードされているデータへの参照を使用しているため、プログラムは新しいデータを認識しません。

これが Web アプリケーションの場合、リクエストごとに新しい依存関係が作成されますが、これは WinForms であるため、単一のコンポジション ルートを保持し、Unity コンテナーをすべて渡さずに、この問題を回避する方法がわかりません。各コントローラーがインスタンスごとの独自の依存関係を解決できるように、私のプログラム(またはそれへの静的参照を持つ)。

この問題の標準的な解決策は何ですか?また、依存関係を構成する方法/場所、または .xml を使用する方法/場所で間違っていることはありDbContextますか?

MVCはWebアプリケーション向けであり、MVVMやMVPのようなものはおそらくWeb以外に適していることを知っていますが、どちらも一度しか呼び出されない単一のコンポジションルートで同じ問題を抱えています.

4

2 に答える 2

0

シングルトンまたはスコープごとに 1 つのインスタンスの場合、依存性注入の構成方法によって異なります。Ninject の DI フレームワークでは、次を使用して指定できることを知っています。

//Thread Scope (New instance on each injection)
kernel.Bind<IInterface>.To<ConcreteClass>().InThreadScope();


//Singleton Scope (One instance per application)
kernel.Bind<IInterface>.To<ConcreteClass>().InSingletonScope()
于 2016-08-03T14:27:08.513 に答える