Ninject获取<;T>;带有构造函数参数

本文关键字:参数 构造函数 获取 lt Ninject gt | 更新日期: 2023-09-27 18:22:51

这是我的模块:

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>上抛出了一个空引用错误,所以我只能假设我没有正确传递构造函数值。使用Get<T>时,如何传入Type

Ninject获取<;T>;带有构造函数参数

因此,这个问题似乎与您的另一个问题有关。

该问题中的要求是将要注入的对象的类型注入到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记录器。这可能需要使用反射,不过我不确定。

在Load方法中,您只需使用Bind<ILogger>().To<NLogLogger>(); 设置即可