asp.net-mvc-3 – 如何不使用Ninject的内核作为资源定位器

我对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’ is obsolete: “Do not use Ninject as Service Locator”

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

我正在努力解决这个问题,但是对于该怎么做却有些不知所措.

我加载了最新的Ninject.Web.Mvc NuGet包,它在App_Start文件夹下创建了NinjectMVC3静态类.我看到他们引用的是Microsoft.Web.Infrastructure.DynamicModuleHelper,但我没有看到它适合我正在尝试做什么.

如果有人有任何提示可以帮助我修复我的小混乱,我将非常感激!

最佳答案 处理第一个问题的方法不是使用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);
} 

不要忘记使用Ninject.Web.Mvc.FilterBindingSyntax添加;为了带来BindFilter<>扩展方法进入范围.

因为您可以访问RegisterServices方法中的内核,这在应用程序启动时发生,您可以连接其他所有内容,包括您的引导程序,…

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

WebActivator基础结构允许您使用单独的初始化方法.

点赞