我对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
,但我看不出那与我想要做的事情相符。
如果有人有任何提示可以帮助我修复我的小混乱,我将非常感激!
答案 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基础结构允许您使用单独的初始化方法。