4

我对 Ninject 和一般的 DI 也很陌生。我使用 NHibernate 作为我的 MVC 应用程序的 ORM,并且对我的结果非常满意。也就是说,直到我从 Ninject 2.1 升级到 2.2。

现在,由于使用 Ninject 的内核作为资源定位器,我的 NinjectWebsiteApplication 类中出现错误。

例子:

 void NinjectWebsiteApplication_BeginRequest(object sender, System.EventArgs e)
 {
     ILogger logger = Kernel.Get<ILogger>();
     logger.Debug(“**********REQUEST BEGIN****************”);
     logger.Debug(“**** URL = ” + Request.Url.AbsolutePath);
 }

示例 2:

protected override void OnApplicationStarted()
{
    var bootstrapper = Kernel.Get<Bootstrapper>();
    bootstrapper.RegisterAllAreas();
    AreaRegistration.RegisterAllAreas();
    ......
    (More stuff here, like AutoMapper mappings, etc.)
    ......
}

*Bootstrapper该类是我创建的一个类,我在其中注册我的路线、全局过滤器等。

在上述两个示例中,我都会收到有关Kernel.Get()函数的警告,其中指出以下内容:

'Ninject.Web.Mvc.NinjectHttpApplication.Kernel' 已过时:“不要使用 Ninject 作为服务定位器”

在对此进行了几次搜索之后,普遍的共识是这是真的。

我正在尝试解决此问题,但不知道该怎么做。

我加载了最新的 Ninject.Web.Mvc NuGet 包,它在 App_Start 文件夹下创建了 NinjectMVC3 静态类。我看到他们正在引用Microsoft.Web.Infrastructure.DynamicModuleHelper,但我看不出这适合我正在尝试做的事情。

如果有人有任何提示可以帮助我解决我的小麻烦,我将不胜感激!

4

1 回答 1

2

第一种的处理方式不是使用NinjectWebsiteApplication_BeginRequest事件而是编写一个自定义的全局动作过滤器:

public class LogActionFilterAttribute : ActionFilterAttribute
{
    private readonly ILogger _logger;
    public LogActionFilterAttribute(ILogger logger)
    {
        _logger = logger;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _logger.Debug("**********REQUEST BEGIN****************");
        _logger.Debug("**** URL = " + filterContext.HttpContext.Request.Url.AbsolutePath);
    }
}

然后在你的App_Start/NinjectMVC3.cs

/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ILogger>().To<Logger>();
    kernel.BindFilter<LogActionFilterAttribute>(FilterScope.Global, 1);
} 

不要忘记添加using Ninject.Web.Mvc.FilterBindingSyntax;以将BindFilter<>扩展方法纳入范围。

而且由于您可以访问RegisterServices在应用程序启动时发生的方法内部的内核,您可以连接其他所有内容,包括您的引导程序,...

就您Global.asax而言,您不再在其中使用任何 Ninject 特定的东西。你不应该从NinjectApplication.

WebActivator 基础结构允许您拥有单独的初始化方法。

于 2012-01-25T15:52:12.200 回答