【问题标题】:MockingKernel Named Multi-Bindings as constructor argumentMockingKernel 命名多重绑定作为构造函数参数
【发布时间】:2018-12-07 10:16:23
【问题描述】:

假设我有一个包含两个实现的接口

public interface IWeapon
{
    string Hit(string target);
}

public class Sword : IWeapon 
{
    public string Hit(string target) 
    {
        return "Slice " + target + " in half";
    }
}

public class Dagger : IWeapon 
{
    public string Hit(string target) 
    {
        return "Stab " + target + " to death";
    }
}

我有一个接受SwordDagger 的对象。我使用Named 多绑定,如docs 中所述。

public class Samurai: ISamurai
{
    private readonly IWeapon sword;
    private readonly IWeapon dagger;

    public Samurai(
        [Named(nameof(Sword))] IWeapon sword,
        [Named(nameof(Dagger))] IWeapon dagger)
    {
        this.sword = sword;
        this.dagger = dagger;
    }
}

当我在运行时将它与普通绑定一起使用时,这很好用:

DependencyInjector.Kernel.Bind<IWeapon>().To<Sword>().Named(nameof(Sword));
DependencyInjector.Kernel.Bind<IWeapon>().To<Dagger>().Named(nameof(Dagger));

当我使用模拟内核时这不起作用:

Mock<IWeapon> mockSword = new Mock<IWeapon>();
Mock<IWeapon> mockDagger = new Mock<IWeapon>();

MockingKernel.Rebind<IWeapon>().ToConstant(mockSword.Object).Named(nameof(Sword));
MockingKernel.Rebind<IWeapon>().ToConstant(mockDagger.Object).Named(nameof(Dagger));

MockingKernel.Get<Samurai>();

我收到以下类型的错误:

Message: OneTimeSetUp: Ninject.ActivationException : Error activating 
IWeapon
No matching bindings are available, and the type is not self-bindable.
Activation path:
  2) Injection of dependency IWeapon into parameter             
sword of constructor of type ISamurai
  1) Request for ISamurai

【问题讨论】:

    标签: c# .net dependency-injection ninject ninject-mockingkernel


    【解决方案1】:

    Rebind&lt;IWeapon&gt;() 方法的问题是它会删除所有基于IWeapon 的绑定,即使您稍后指定Named 语法。这意味着第二个重新绑定调用消除了第一个。所以试试这个:

    MockingKernel.Rebind<IWeapon>().ToConstant(mockSword.Object).Named(nameof(Sword));
    MockingKernel.Bind<IWeapon>().ToConstant(mockDagger.Object).Named(nameof(Dagger));
    

    【讨论】:

    • 这完全有道理。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多