如何使用unity来根据注入的类型有条件地绑定实例?

Dav*_*Lay 6 ninject ioc-container unity-container

我已经习惯了Ninject,对于一个特定的项目,我被要求学习Unity.

有一件事我无法找到有关如何做的信息.

在Ninject我可以说:

Bind<IWarrior>().To<Samurai>().Named("Samurai");
Bind<IWarrior>().To<Ninja>().Named("Ninja");
Bind<IWeapon>().To<Katana>().WhenInjectedInto(typeof(Samurai));
Bind<IWeapon>().To<Shuriken>().WhenInjectedInto(typeof(Ninja));
Run Code Online (Sandbox Code Playgroud)

然后,当一个人要求武士名为武士时,武士带有卡纳纳,忍者带有手里剑.正如它应该.

我不想在战士中引用容器以获得适当的武器,并且不希望用属性污染模型(在另一个没有引用ninject或统一的程序集中)

PD:我正在寻找一种代码方式,而不是通过xml配置.

ono*_*nof 7

这应该适用于Unity:

Container
 .Register<IWeapon, Katana>("Katana")
 .Register<IWeapon, Shuriken>("Shuriken")
 .Register<IWarrior, Samurai>("Samurai", new InjectionConstructor(new ResolvedParameter<IWeapon>("Katana"))
 .Register<IWarrior, Ninja>("Ninja", new InjectionConstructor(new ResolvedParameter<IWeapon>("Shuriken")));
Run Code Online (Sandbox Code Playgroud)

测试:

var samurai = Container.Resolve<IWarrior>("Samurai");
Assert.IsTrue(samurai is Samurai);
Assert.IsTrue(samurai.Weapon is Katana);

var ninja = Container.Resolve<IWarrior>("Ninja");
Assert.IsTrue(ninja is Ninja);
Assert.IsTrue(ninja.Weapon is Shuriken);
Run Code Online (Sandbox Code Playgroud)