2012-01-25 28 views
3

我对Ninject以及DI一般都很陌生。我使用NHibernate作为我的MVC应用程序的ORM,并对我的结果非常满意。也就是说,直到我从Ninject 2.1升级到2.2。如何不使用Ninject的内核作为资源定位器

现在,由于使用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,但我没有看到哪些内容符合我想要做的。

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

回答

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而言不再使用任何注入特定的东西。你不应该从NinjectApplication派生。

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

+0

感谢您的详细解释!我明白理解日志操作过滤器如何适用于开始请求,但结束请求又如何?例如,我有以下(也处理我的IUnitOfWork): void NinjectWebsiteApplication_EndRequest(object sender,System.EventArgs e){ILOGger logger = Kernel。获取(); IUnitOfWork uow = Kernel.Get (); uow.Displose(); logger.Debug(“************ REQUEST END ************”); } – hiro77

+0

@JoelHulen,你只需在自定义操作过滤器中覆盖OnActionExecuted或OnResultExecuted方法,就像我展示OnActionExecuting方法一样,这取决于你想要在哪里处理你的工作单元:该操作已完成执行或视图已完成呈现。另外,如果你要处置你的UoF,你可能不应该调用LogActionFilterAttribute属性。你可以创建另一个进行处理。 –

+0

它完美地工作。谢谢!在你看来,就处置UoW而言,是否存在一个优先处理OnAction执行OnResultExecuted?另外,您是否知道控制器操作“退出”全局过滤器属性的方法? – hiro77

相关问题