Ninject使用构造函数参数获取<t>

时间:2015-11-19 08:55:53

标签: c# unit-testing ninject inversion-of-control

这是我的模块:

public class LoggerModule : NinjectModule
{
    public override void Load()
    {
        Bind<ILogger>().To<NLogLogger>()
            .WithConstructorArgument(
                typeof(Type),
                x => x.Request.ParentContext.Plan.Type);
    }
}

因为您可以看到NLogLogger期望将Type传递给构造函数。

这是我的单元测试:

    [Test]
    public void ResolveLoggerDependency()
    {
        var module = new LoggerModule();
        var kernal = new StandardKernel(module);
        var service = kernal.Get<ILogger>(new ConstructorArgument("type", typeof(int)));
        Assert.That(service, Is.Not.Null);
    }

它在kernal.Get<ILogger>上抛出一个空引用错误,所以我只能假设我没有正确传递构造函数值。使用Type时如何传递Get<T>

2 个答案:

答案 0 :(得分:3)

所以,这个问题似乎与你的other question有关。

该问题的要求是向NLogLogger注入将被注入的对象的类型。

在这种情况下的注册假设此接口ILogger将不会在将被注入的父类的上下文之外解析。并且您正在获得异常,因为直接尝试解析ILogger接口时没有父类上下文。

我假设在你的单元测试中,你想测试这个注册实际上是有效的。我建议如下:

首先,创建一个将在测试中使用的类:

public class TestClass
{
    private readonly ILogger m_Logger;

    public TestClass(ILogger logger)
    {
        m_Logger = logger;
    }

    public ILogger Logger
    {
        get { return m_Logger; }
    }
}

然后在你的单元测试中使用这样的类:

[Test]
public void ResolveLoggerDependency()
{
    var module = new LoggerModule();
    var kernal = new StandardKernel(module);
    var test_object = kernal.Get<TestClass>();
    Assert.That(test_object.Logger, Is.Not.Null);
}

您可以进一步验证NLogLogger实际使用TestClass类的名称来构建NLog记录器。这可能需要使用Reflection,但我不确定。

答案 1 :(得分:-1)

在您的加载方法中,您只需使用Bind<ILogger>().To<NLogLogger>();

进行设置即可