gpt4 book ai didi

c# - 使用构造函数参数 Ninject Get

转载 作者:行者123 更新时间:2023-11-30 16:51:29 25 4
gpt4 key购买 nike

这是我的模块:

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> 时?

最佳答案

所以,这个问题似乎与您的 other question 有关.

该问题的要求是将要注入(inject)的对象类型注入(inject)到 NLogLogger 中。

这种情况下的注册假设此接口(interface) ILogger 不会在它将被注入(inject)的父类的上下文之外解析。当您直接尝试解析 ILogger 接口(interface)时,您会遇到异常,因为没有父类上下文。

我假设在您的单元测试中,您希望测试此注册是否有效。我建议如下:

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

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不过,我不确定。

关于c# - 使用构造函数参数 Ninject Get<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33799180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com