Ninject 使用构造函数参数获取<T>
Ninject Get<T> with constructor argument
这是我的模块:
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
?
在您的 Load 方法中,您可以使用 Bind<ILogger>().To<NLogLogger>();
进行设置
所以,这个问题似乎与您的有关。
该问题的要求是向 NLogLogger
注入对象的类型。
这种情况下的注册假设此接口 ILogger
不会在它将被注入的父 class 的上下文之外解析。当您直接尝试解析 ILogger
接口时,您会遇到异常,因为没有父 class 上下文。
我假设在您的单元测试中,您想要测试此注册是否有效。我建议如下:
首先,创建一个 class 您将在测试中使用的:
public class TestClass
{
private readonly ILogger m_Logger;
public TestClass(ILogger logger)
{
m_Logger = logger;
}
public ILogger Logger
{
get { return m_Logger; }
}
}
然后在你的单元测试中使用这样的class:
[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
class 的名称来构造 NLog 记录器。这可能需要使用 Reflection,但我不确定。
这是我的模块:
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
?
在您的 Load 方法中,您可以使用 Bind<ILogger>().To<NLogLogger>();
所以,这个问题似乎与您的
该问题的要求是向 NLogLogger
注入对象的类型。
这种情况下的注册假设此接口 ILogger
不会在它将被注入的父 class 的上下文之外解析。当您直接尝试解析 ILogger
接口时,您会遇到异常,因为没有父 class 上下文。
我假设在您的单元测试中,您想要测试此注册是否有效。我建议如下:
首先,创建一个 class 您将在测试中使用的:
public class TestClass
{
private readonly ILogger m_Logger;
public TestClass(ILogger logger)
{
m_Logger = logger;
}
public ILogger Logger
{
get { return m_Logger; }
}
}
然后在你的单元测试中使用这样的class:
[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
class 的名称来构造 NLog 记录器。这可能需要使用 Reflection,但我不确定。