Ninject传递构造函数参数typeof类,用于实现接口

时间:2015-11-18 21:33:40

标签: c# ninject inversion-of-control

我正在尝试将Ninject与我的应用程序日志包装器一起使用。

这是包装器:

public class NLogLogger : ILogger
{
    private readonly Logger _logger;

    public NLogLogger(Type t)
    {
        _logger = LogManager.GetLogger(t.Name);
    }
}

正如您所看到的,我将该类型传递给loggers constrctor,因此我将使用它,如下所示:

public class EntityObject
{
    public ILogger Logger { get; set; }

    public EntityObject()
    {
        Logger = new NLogLogger(typeof(EntityObject));
    }
}

现在我似乎无法找到如何使用Ninject做类似的事情。 这是我的绑定模块:

public class LoggerModule : NinjectModule
{
    public override void Load()
    {
        Bind<ILogger>().To<NLogLogger>();
    }
}

现在很明显我抛出一个异常,因为它无法将类型注入到构造函数中。我有什么想法可以做到这一点吗?

  

激活类型

时出错      

没有匹配的绑定可用,并且该类型不可自我绑定。

     

激活路径:

     

4)将依赖项注入类型为NLogLogger类型的构造函数的参数t

     

3)将依赖ILogger注入到NzbGetSettingsService类型的构造函数的参数logger中

     

2)将依赖ISettingsService {NzbGetSettingsDto}注入到DashboardController类型的构造函数的参数nzbGetService中

     

1)请求DashboardController

1 个答案:

答案 0 :(得分:2)

假设您的课程如下:

public class EntityObject
{
    public ILogger Logger { get; set; } //it is better by the way to convert this into a private field

    public EntityObject(ILogger logger)
    {
        Logger = logger;
    }
}

您需要像这样注册NLogLogger

Bind<ILogger>().To<NLogLogger>()
    .WithConstructorArgument(
        typeof(Type),
        x => x.Request.ParentContext.Plan.Type);