【问题标题】:How to conditionally bind a instance depending on the injected type using unity?如何使用统一根据注入的类型有条件地绑定实例?
【发布时间】:2011-06-27 14:52:48
【问题描述】:

我习惯了 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));

然后,当有人问起名为 samurai 的武士时,武士会带上假名,而忍者会带上手里剑。应该的。

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

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

【问题讨论】:

    标签: unity-container ioc-container ninject


    【解决方案1】:

    这应该适用于 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")));
    

    测试

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

    【讨论】:

    • 确定会执行 WhenInjectedInto 吗?
    • 我添加了一个测试部分来显示该代码在容器中注册的内容。它应该是 OP 正在寻找的。​​span>
    • InjectionConstructor 没有任何类型参数,还是我在某处缺少导入?
    • 我是否认为如果不单独指定每个构造函数参数就无法完成这项工作? :(
    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多