2012-04-10 8 views
2

Ich verwende MVVM und PRISM. Im Projekt habe ich eine gemeinsame Schnittstelle namens IFoo und andere Module sollten diese Schnittstelle implementieren und registrieren.PRISM: Verwenden MVVM, wie Sie in einem Konstruktor Objekte auflösen oder injizieren?

Wenn ich dann das Modul1 initialisiere, registriere ich meinen Typ und navigiere.

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

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

Ansicht1 Konstruktor enthält Ansichtsmodell, wobei diese Ansicht Modell hat in seinem Konstruktor:

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

Bis dies in Ordnung ist. Aber später muss ich das Foo1 von externen Modulen bekommen. Also, habe ich eine andere Registry-Mapping Namen für Foo1:

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

Und richtig, es ist für mich zu arbeiten, aber ich weiß nicht, wie die Idee, zwei Instanzen zu haben, getrennt. Ich muss nur einen haben und auf dieselbe Instanz zugreifen.

Gibt es eine Möglichkeit, dieses Szenario zu beheben? Vielen Dank im Voraus.

Wie auch immer, ich füge eine Zip, wo eine Demo enthält, die mein Problem darstellt. http://www.mediafire.com/?feod8x0b952457e

Antwort

3

Sie können alle Typen im Bootstrapper registrieren, wenn Sie die Module laden.

// 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 
     }); 
    } 
} 

Dann in Karte Sie alle Arten und/oder Instanzen, die Sie später zugreifen möchten. Der konfigurierte Container wird in Ihrem Konstruktor für Module1Module übergeben.

// 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

Ich glaube nicht, dass Sie Foo1 zweimal registrieren müssen. Sie verwenden ContainerControlledLifetimeManager. Wenn Sie also den Unity-Container nach einer IFoo-Instanz fragen, erhalten Sie Foo1 - Sie müssen keinen Namen als Schlüssel verwenden.

Also, in module1 Sie Foo1 registrieren:

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

Und in Ihrem externen Modul:

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

// someFoo is the same object as Foo1, so the hashcodes will be equal. 
System.Diagnostics.Debug.Print(someFoo.GetHashCode());