使用Ninject 2.0与ASP .Net 3.5

3

我正在尝试将Ninject 2.0与Asp .Net 3.5 Web应用程序一起使用。以下是我使用的DLL和它们的版本。

  • Ninject.dll - v2.0.0.0
  • Ninject.Extensions.Logging.dll v2.0.0.0
  • Ninject.Web.dll v1.0.0.0

在我的global.ascx.cs文件中,我有以下方法。

protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel();            
        kernel.Bind<IDataAccess>().To<DataAccessEntBlock>().InSingletonScope();
        return kernel;
    }

当我运行应用程序时,我遇到了以下错误。
Error activating ILoggerFactory
No matching bindings are available, and the type is not self-bindable.
Activation path:
 1) Request for ILoggerFactory

Suggestions:
 1) Ensure that you have defined a binding for ILoggerFactory.
 2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
 3) Ensure you have not accidentally created more than one kernel.
 4) If you are using automatic module loading, ensure the search path and filters are

正确。

虽然我没有尝试注册Logger,但我仍然不理解为什么它似乎在尝试创建自己。我该如何解决这个错误?我是否需要使用Ninject的扩展Logger?

谢谢 GK


请修复格式(泛型类型缺失,请使用预览!)。第一个猜测是查找建议2. - Benjamin Podszun
2个回答

6
错误表明Ninject在某个地方尝试将ILoggerFactory接口解析为具体类。根据您上面提到的参考资料,看起来您的ASP.Net Web应用程序是基于WebForms而不是ASP.Net MVC应用程序。
考虑到这一点,您的页面应该派生自PageBase,这是Ninject Web库提供的一个抽象类。该类具有以下属性定义:
[Inject]
public ILogger Logger { get; set; }

因此,当您的页面实例化时,Ninject会尝试将一个记录器注入到页面上的属性中。正如错误所指出的那样,您需要为ILoggerFactoryILogger定义绑定;然而,您提供的唯一绑定是IDataAccess。您还需要加载日志扩展库中定义的模块之一。我认为您可以在NLog和Log4Net之间进行选择。例如,如果您想使用Log4Net,则您的CreateKernel函数应该像这样:
protected override IKernel CreateKernel()
{
    IKernel kernel = new StandardKernel(new Log4netModule());            
    kernel.Bind<IDataAccess>().To<DataAccessEntBlock>().InSingletonScope();
    return kernel;
}

假设您的文件中有一个 using Ninject.Extensions.Logging.Log4net; 的声明。
无论哪种情况,您都需要选择一个记录器并加载它的绑定(通过模块),因为Ninject Web库需要它。如果您现在没有任何日志记录问题,您可以选择提供ILoggerFactoryILogger的实现,这些实现不执行任何操作(即“null”记录器),并自己绑定您的虚拟ILoggerFactory。

1
我也曾遇到过同样的问题。 尝试引用以下文件:log4net.dll、ninject.extensions.logging.dll、ninject.extensions.log4net.dd、ningject.web.dll 和 ninject.dll。 这解决了我的问题。很可能是因为旧版本的 log4net.dll 导致的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接