在TinyIoC中注入命名注册

时间:2012-09-13 00:11:55

标签: c# tinyioc

我有一个接口IRofl,其实现名为DefaultRofl,具有以下构造函数签名:

public DefaultRofl(ICanHasCheezburger cheez)

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

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

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

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

我原本希望这样做的方式是

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

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

实际上,在Jeff Atwood解决橡皮鸭问题的另一个案例中,我只是想通了:

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

诀窍。但是,如果我有更多的构造函数参数,我必须显式地声明所有的container.Resolve()调用,对吧?史蒂芬? ; - )

1 个答案:

答案 0 :(得分:1)

如果你使用命名注册,那么只有三种方法来检索它们要么使用你在那里的Resolve重载(取名字),手动使用ResolveAll,要么取得IEnumerable的依赖,它将为你提供所有命名的注册Foo。