Asp.net mvc 3 如何不使用Ninject';将内核作为资源定位器
我对Ninject和DI都是相当陌生的。我使用NHibernate作为我的MVC应用程序的ORM,并且对我的结果非常满意。也就是说,直到我从Ninject 2.1升级到2.2 现在,由于使用Ninject的内核作为资源定位器,我在NinjectWebsiteApplication类中遇到了错误 例如:Asp.net mvc 3 如何不使用Ninject';将内核作为资源定位器,asp.net-mvc-3,ninject,ninject.web.mvc,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 lo
void NinjectWebsiteApplication_BeginRequest(object sender, System.EventArgs e)
{
ILogger logger = Kernel.Get<ILogger>();
logger.Debug(“**********REQUEST BEGIN****************”);
logger.Debug(“**** URL = ” + Request.Url.AbsolutePath);
}
void ninject网站应用程序_BeginRequest(对象发送方,System.EventArgs e)
{
ILogger logger=Kernel.Get();
logger.Debug(“**********请求开始*******************”);
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.)
......
}
applicationstarted()上受保护的覆盖无效
{
var bootstrapper=Kernel.Get();
bootstrapper.RegisterAllAreas();
RegisterAllAreas();
......
(这里有更多内容,如自动映射等)
......
}
*Bootstrapper
类是我创建的一个类,我在其中注册路由、全局过滤器等
在上述两个示例中,我都收到了关于Kernel.Get()
函数的警告,其中说明了以下内容:
“Ninject.Web.Mvc.NinjectHttpApplication.Kernel”已过时:“不要将Ninject用作服务定位器”
在对这一点进行了几次调查之后,人们普遍认为这是事实
我正在努力解决这个问题,但不知该怎么办
我加载了最新的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);
}
}
然后在你的应用程序中启动/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);
}
//
///在这里加载您的模块或注册您的服务!
///
///内核。
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
BindFilter(FilterScope.Global,1);
}
不要忘记使用Ninject.Web.Mvc.FilterBindingSyntax添加
以将BindFilter
扩展方法引入范围
由于您可以在应用程序启动时访问RegisterServices
方法中的内核,因此您可以连接所有其他内容,包括引导程序
就您的Global.asax
而言,您不再在其中使用任何特定于Ninject的东西。您不应该从ninject应用程序
派生
WebActivator基础结构允许您使用单独的初始化方法。感谢您的详细解释!我明白了日志操作过滤器是如何处理开始请求的,但是结束请求呢?例如,我有以下内容(也处理我的IUnitOfWork):void NinjectWebsiteApplication_EndRequest(对象发送者,System.EventArgs e){ILogger logger=Kernel.Get();IUnitOfWork uow=Kernel.Get();uow.dispose();logger.Debug(“*******************请求结束*************”;}@JoelHulen,您只需覆盖自定义操作过滤器中的
OnActionExecuted
或OnResultExecuted
方法,就像我显示的OnActionExecuting
方法一样,这取决于您要在何处处置工作单元:在操作完成执行或视图完成渲染之后。另外,如果要处理UoF,可能不应该调用属性LogActionFilterAttribute
。你可以创建另一个用于处理的。它工作得非常好。谢谢在您看来,就处理UoW而言,是否存在优先处理OnActionExecuted而不是OnResultExecuted的情况?另外,您知道控制器操作“选择退出”全局过滤器属性的方法吗?@JoelHulen,这将取决于您是否需要视图中的UoW。通常情况下,您不应该这样处理OnActionExecuted
似乎更好。UoW越短越好。就从全局操作属性中选择退出而言,使用Ninject的BindFilter语法是完全可能的。之后,您可以在时链接,并定义必须满足的条件以应用过滤器。如果您不使用Ninject,您可以编写一个自定义过滤器提供程序,并且仍然可以实现相同的效果。