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
?
因此,这个问题似乎与您的另一个问题有关。
该问题中的要求是将要注入的对象的类型注入到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>();
设置即可