2

私はMVVMとPRISMを使用しています。このプロジェクトでは、IFoo と呼ばれる共通のインターフェイスがあり、他のモジュールはこのインターフェイスを実装して登録する必要があります。

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

そうです、それは私にとってはうまくいきますが、2 つのインスタンスを分離するという考えは好きではありません。1つだけ持っていて、同じインスタンスにアクセスする必要があります。

このシナリオを修正する方法はありますか? 前もって感謝します。

とにかく、私の問題を表すデモが含まれている Zip を添付します。 http://www.mediafire.com/?feod8x0b952457e

4

2 に答える 2

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

次に、ConfigureContainer後でアクセスするすべてのタイプやインスタンスをマップします。構成されたコンテナーは、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>();
}
于 2012-04-10T20:49:40.990 に答える
1

Foo1 を 2 回登録する必要はないと思います。を使用しているContainerControlledLifetimeManagerため、Unity コンテナーに IFoo インスタンスを要求するたびに、Foo1 が返されます。名前をキーとして使用する必要はありません。

したがって、module1Foo1 を登録します。

_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());
于 2012-04-12T16:50:40.223 に答える