【问题标题】:Ninject pass constructor argument typeof class that implements the interfaceNinject 传递构造函数参数 typeof 实现接口的类
【发布时间】:2015-11-18 21:33:39
【问题描述】:

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

这是包装器:

public class NLogLogger : ILogger
{
    private readonly Logger _logger;

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

如您所见,我将类型传递给记录器构造函数,因此我将按如下方式使用它:

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 类型的构造函数的参数记录器中

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

1) DashboardController 的请求

【问题讨论】:

    标签: c# ninject inversion-of-control


    【解决方案1】:

    假设您的类如下所示:

    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);
    

    【讨论】:

    • 太棒了,谢谢。我一直在为这个而烦恼!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    相关资源
    最近更新 更多