如何不使用Ninject的内核作为资源定位器

时间:2012-01-25 15:25:08

标签: asp.net-mvc-3 ninject ninject.web.mvc

我对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,但我看不出那与我想要做的事情相符。

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

1 个答案:

答案 0 :(得分: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基础结构允许您使用单独的初始化方法。