Как условно связать экземпляр в зависимости от введенного типа с помощью единицы? - PullRequest
6 голосов
/ 15 февраля 2011

Я привык к 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));

И затем, когда кто-то просит воина по имени самурай, самурай приходит с кананой, а ниндзя - с сюрикенами. Как и должно быть.

Я не хочу ссылаться на контейнер воинов, чтобы получить соответствующее оружие, и не хочу загрязнять модель атрибутами (находится в другой сборке, в которой нет ссылки на точку или единицу)

PD: я ищу способ кода, а не через xml config.

1 Ответ

7 голосов
/ 15 февраля 2011

Это должно работать с 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")));

Test

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