Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何不使用Ninject';将内核作为资源定位器_Asp.net Mvc 3_Ninject_Ninject.web.mvc - Fatal编程技术网

Asp.net mvc 3 如何不使用Ninject';将内核作为资源定位器

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

我对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);
 }
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,您可以编写一个自定义过滤器提供程序,并且仍然可以实现相同的效果。