2012-04-10 6 views
2

私はMVVMとPRISMを使用しています。このプロジェクトでは、私はIFooと呼ばれる共通のインターフェースを持っており、他のモジュールはこのインターフェースを実装して登録する必要があります。PRISM:MVVMを使用して、コンストラクタオブジェクトを解決または注入する方法は?

// Common module 
public interface IFoo { } 

// Module1 module 
public class Foo1 : IFoo { } 

次に、module1を初期化するときに、自分のタイプを登録してナビゲートします。

_container.RegisterType<IFoo, Foo1>(new ContainerControlledLifetimeManager()); 
_container.RegisterType<Object, View1>("View1"); 

var module = new Uri("View1", UriKind.Relative); 
_regionManager.RequestNavigate("MainRegion", module); 

View1をコンストラクタはViewModelにが含まれ、このビューモデルは、コンストラクタにあります。このまで

public ViewModel1(IFoo foo, IEventAggregator eventAggregator, IRegionManager regionManager) 
    { 
     ... 
    } 

は、大丈夫です。しかし、後で、私は外部モジュールからFoo1を取得する必要があります。だから、私はFOO1のマッピング名に別のレジストリ設定:

_container.RegisterType<IFoo, Foo1>(new ContainerControlledLifetimeManager()); 
_container.RegisterType<IFoo, Foo1>("foo1", new ContainerControlledLifetimeManager()); 

そして右が、それは私のために働いていますが、私は分離された二つのインスタンスを持っているという考えが好きではありません。私はちょうど1つしか持っていなくても、同じインスタンスにアクセスする必要があります。

このシナリオを修正する方法はありますか? ありがとうございます。

とにかく、問題のあるデモを含むZipを添付します。 http://www.mediafire.com/?feod8x0b952457e

答えて

3

モジュールをロードすると、すべてのタイプをブートストラップに登録できます。

// register all modules 
protected override void ConfigureModuleCatalog() 
{ 
    // get all module types 
    var types = new List<Type>(); 
    types.Add(typeof(ModuleA)); 
    types.Add(typeof(ModuleB)); 
    types.Add(typeof(ModuleC)); 

    // register all types 
    foreach (var type in types) 
    { 
     ModuleCatalog.AddModule(new ModuleInfo() 
     { 
      ModuleName = type.Name, 
      ModuleType = type.AssemblyQualifiedName 
     }); 
    } 
} 

はその後に、あなたが後でアクセスしたいすべてのタイプおよび/またはインスタンスをマッピングします。設定されたコンテナは、Module1Moduleのコンストラクタに渡されます。

// register all types in all modules 
protected override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 

    // ModuleA 
    Container.RegisterType<IInterface1, Type1>(); 
    Container.RegisterType<IInterface2, Type2>(); 

    // ModuleB 
    Container.RegisterInstance<IInterface3>("name", new Type3()); 
    Container.RegisterType<IInterface4, Type4>(); 

    // ModuleC 
    Container.RegisterType<IInterface5, Type5>(); 
    Container.RegisterType<IInterface6, Type6>(); 
} 
1

Foo1を2回登録する必要はありません。 ContainerControlledLifetimeManagerを使用していますので、UnityコンテナにIFooインスタンスがあるかどうか尋ねると、Foo1が表示されます。名前をキーとして使う必要はありません。だから、

module1にあなたはFOO1登録:

_container.RegisterType<IFoo, Foo1>(new ContainerControlledLifetimeManager()); 
System.Diagnostics.Debug.Print(Foo1.GetHashCode()); 

そして、あなたの外部モジュールで:

IFoo someFoo = _container.Resolve<IFoo>(); 

// someFoo is the same object as Foo1, so the hashcodes will be equal. 
System.Diagnostics.Debug.Print(someFoo.GetHashCode()); 
関連する問題