3

我有一个带有以下构造函数签名IRofl的实现的接口:DefaultRofl

public DefaultRofl(ICanHasCheezburger cheez)

ICanHasCheezburger有几个实现,其中我需要通过 IoC 容器解决多个,我认为命名注册是正确的方法。

假设我有两个预先创建的实例,希望一个作为默认注册,另一个命名为:

container.Register<ICanHasCheezburger>(cheez1);
container.Register<ICanHasCheezburger>(cheez2, "x2");

现在我需要指定 for DefaultRofl,应该解决“x2”注册 - 这就是我卡住的地方。我知道 Autofac 可以做到这一点,但我找不到 TinyIoC 的方法。

我本来希望这样做的方法是

container.Register<IRofl, DefaultRofl>().UsingConstructor(() => new DefaultRofl(container.Resolve<ICanHasCheezburger>("x2")));

但事实证明(我什至有点理解为什么),ICanHasCheezburger构造函数参数只是一个虚拟参数,并没有实际评估。这意味着名称也将被忽略,并且接口的默认注册已解决 - 但这是cheez1,我不想在这里使用它。

实际上,在杰夫阿特伍德的橡皮鸭问题解决的另一个案例中,我只是想通了:

container.Register<IRofl>((c, p) => new DefaultRofl(container.Resolve<ICanHasCheezburger>("x2")));

成功了。但是,如果我有更多的构造函数参数,我必须明确声明所有的 container.Resolve() 调用,对吧?史蒂文? ;-)

4

1 回答 1

1

如果您使用命名注册,那么检索它们的唯一三种方法是使用您在那里拥有的 Resolve 重载(使用名称)、手动使用 ResolveAll 或采用 IEnumerable 的依赖项,这将为您提供 Foo 的所有命名注册。

于 2012-09-13T07:38:04.347 回答