3

、、IFooおよび の 3 つの具象クラスがあります。FooA : IFooFooB : IFooMultiFoo : IFoo

のコンストラクタはMultiFoo次のようになります。

public MultiFoo(params IFoo[] foos) { ... }

MultiFooUnityに登録するときに、特定の解像度のオーバーライドを指定できますか? 私はこのようなことができるようにしたいと思います:

container.RegisterType<IFoo, FooA>("Foo A");
container.RegisterType<IFoo, FooB>("Foo B");

container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetime(),
    new ResolvedOverride<IFoo>("Foo A"),
    new ResolvedOverride<IFoo>("Foo B")
);

これにより、解決された FooA と解決された FooB が解決時にコンストラクターに渡されます

new MultiFoo(new FooA(), new FooB())
4

1 に答える 1

2

paramsコンパイラの構文シュガーリングです。実際には、配列を単一のパラメーターとして渡しています。それに合わせて、コンテナを次のように構成します。

container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetimeManager(),
    new InjectionConstructor(new ResolvedArrayParameter<IFoo>(new ResolvedParameter<IFoo>("Foo A"), new ResolvedParameter<IFoo>("Foo B"))));

リゾルバーのオーバーライドは、コンテナーのセットアップ時ではなく、解決時に使用されます。解決オーバーライドを使用した同等のものは次のようになります。

container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetimeManager());

var foo = container.Resolve<IFoo>(
    new ParameterOverride(
        "foos", 
        new ResolvedArrayParameter<IFoo>(new ResolvedParameter<IFoo>("Foo A"), new ResolvedParameter<IFoo>("Foo B"))));
于 2012-11-28T17:35:23.727 に答える