加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 使用Ninject 2.2全局动作过滤器的MVC 3依赖注

发布时间:2020-12-16 04:21:26 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试使用ASP.NET MVC 3和Ninject 2.2将logger对象注入自定义ActionFilterAttribute. 如果我使用自定义属性标记每个控制器,我能够使其工作. 但是,如果我从控制器中删除属性修饰并尝试使用全局操作过滤器,则无法使其工作. 这是代码: 在App_Start下 – N
我正在尝试使用ASP.NET MVC 3和Ninject 2.2将logger对象注入自定义ActionFilterAttribute.

如果我使用自定义属性标记每个控制器,我能够使其工作.

但是,如果我从控制器中删除属性修饰并尝试使用全局操作过滤器,则无法使其工作.

这是代码:

在App_Start下 – NinjectMVC3.cs

using NinjectTest.Abstract;
using NinjectTest.Concrete;

[assembly:      WebActivator.PreApplicationStartMethod(typeof(NinjectTest.App_Start.NinjectMVC3),"Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(NinjectTest.App_Start.NinjectMVC3),"Stop")]

namespace NinjectTest.App_Start
{
using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Mvc;

public static class NinjectMVC3 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        RegisterServices(kernel);
        return kernel;
    }

    /// <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<Log4NetLogger>();
    }       
}

}

的Global.asax.cs

using System.Web.Routing;
using NinjectTest.Attributes;

namespace NinjectTest
{
public class MvcApplication : HttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new TestLoggingAttribute());
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",// Route name
            "{controller}/{action}/{id}",// URL with parameters
            new { controller = "Home",action = "Index",id = UrlParameter.Optional } // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        log4net.Config.XmlConfigurator.Configure();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
}

}

TestLoggingAttribute.cs

using System.Web.Mvc;
using Ninject;
using NinjectTest.Abstract;

namespace NinjectTest.Attributes
{
public class TestLoggingAttribute : ActionFilterAttribute
{
    [Inject]
    public ILogger _logger { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {

        var controller = filterContext.RouteData.Values["controller"];
        var action = filterContext.RouteData.Values["action"];

        _logger.Info("controller: " + controller + " action: " + action);

        base.OnActionExecuted(filterContext);
    }     

  }
}

HomeController.cs

using System.Web.Mvc;
using NinjectTest.Attributes;

namespace NinjectTest.Controllers
{
//[TestLogging]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }

}
}

就像我提到的,如果我取消注释控制器中的[TestLogging]属性,这一切都有效.但是,我想使用全局过滤器.
有人可以帮我吗?

解决方法

您可能会发现 following blog post很有用.所以在您的RegisterServices方法中只需:
private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ILogger>().To<Log4NetLogger>();
    kernel.BindFilter<TestLoggingAttribute>(FilterScope.Global,0);
}

并将BindFilter扩展方法纳入范围,不要忘记添加正确的using指令:

using Ninject.Web.Mvc.FilterBindingSyntax;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读