1

こんにちは、私は現在モデル/ビュー パターンと IOC で WPF を使用していますが、実行時に決定される 2 つだけを作成する必要がある 3 つのビューがあるという問題があります。

各ビューで、次のように xaml を使用してビューのオブジェクトを提供しています。

ビューA

<viewmodel:modelA x:Key="viewModel"/>

また

ViewB

<viewmodel:modelB x:Key="viewModel"/>

...等

また、これらのビューとそれに続くモデルには、次のような階層があります。

class modelA          { public virtual  ConfigA    {get; set;}   } 
class modelB : modelA { public override ConfigB    {get; set;}   }
class modelC : modelB { public override ConfigC    {get; set;}   }

class ConfigA           { public int Test  { get; set;} } 
class ConfigB : ConfigA { public int TestA { get; set;} } 
class ConfigC : ConfigC { public int TestB { get; set;} } 

現在、IOC を使用してコンテナーを作成し、必要なモデル (モデル B またはモデル C) のインスタンスを登録しています。必要なビューをインスタンス化しようとすると、container.resolve を介して、ViewA + ViewB または ViewA + ViewC のいずれかになります。

モデルの複数のインスタンス化を取得します。

modelB または modelC の 1 つのタイプのみを作成する場合。

switch (Object)
{
  case 1:
    modelB b = new modelB();
    Container.RegisterInstance<modelB>(b, new ContainerControlledLifetimeManager());
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewB>());
  break;
  case 1:
    modelC c = new modelC();
    Container.RegisterInstance<modelC>(c, new ContainerControlledLifetimeManager());
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewC>());
  break;
}
RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewA>());

私が望むのは、コンテナーがモデルの既に構築されたインスタンスを使用し、これをビューに挿入することである場合、ビューの解決により、より多くのモデルが生成されます。誰か助けてくれたり、正しい方向に向けてくれたり、

ありがとう、

4

2 に答える 2

1

私が正しい方向に進んでいるかどうかはよくわかりませんが、とにかく私が助けることができるかどうか見ていきます.

View/ModelB シナリオを見ると、あなたが持っているものを見る方法は次のとおりです。

  1. ModelB の単一インスタンスを UnityContainer に登録します
  2. 新しい ViewB を解決しようとする
  3. 手順 1 のインスタンスが使用されるのではなく、ModelB の新しいインスタンスが作成されます。

ViewB オブジェクトが作成されると、unity コンテナーとは独立して新しい ModelB が作成されます。Unity コンテナーに以前に登録した ModelB のインスタンスを使用する場合は、ViewB の依存関係として渡すことができます。

public class ViewB
{
    public ViewB(ModelB model){ .. }
}

この設定がある場合、ViewB を解決しようとすると、以前に登録した ModelB が渡されます。

それが役立つことを願っています!

于 2012-08-03T02:59:40.860 に答える
0

誰かが後でこれを見つけて知りたい場合に備えて、ビューでビューモデルへの静的参照を基本的に取り出すことでこの問題を解決しました。

<viewmodel:modelB x:Key="viewModel"/>

Scott が提案するように、最初に型を登録し、次にその型のインスタンスを登録し、次に継承されたビューを解決し、続いて基本ビュー (DI コンテナーによって呼び出されると、登録された型に挿入されます) を解決します。残念ながら、VS2010 内では、ビュー コンストラクターのコード ビハインドから DataContext を設定する必要があったため、デザイナーを使用して xaml でバインディングを作成できませんでした。

コード:

  UserControl view = null;
  switch (runtimeSetArg)
  {
    case 1:
      Container.RegisterType<modelA, modelB>(new ContainerControlledLifetimeManager());
      Container.RegisterInstance<modelB>(new modelB());
      view = Container.Resolve<viewB>();
      break;
    case 2:
      Container.RegisterType<modelA, modelC>(new ContainerControlledLifetimeManager());
      Container.RegisterInstance<modelC>(new modelC());
      view = Container.Resolve<viewC>();
      break;
    case 3:
      ...
      break;
    case default:
      break;
  }

  if (view != null)
  {
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<viewA>());        
    RegionManager.Regions[RegionNames.MainRegion].Add(view);
  }

そして、ビューの背後にあるコードで

public partial class ViewB: UserControl
{
  public ViewB(IUnityContainer container)
  {
    this.DataContext = (ModelB)container.Resolve<ModelB>();      
    InitializeComponent();
  }
}

私が言うように、これで問題は解決しましたが、継承されたビューとそのモデルを使用するよりクリーンな方法があればよかったのにと思います。私はまだ探していますが、これで立ち往生している他の人の助けになるなら、それは素晴らしいことです.

于 2012-08-06T12:30:15.737 に答える