gpt4 book ai didi

asp.net-mvc-3 - MVC 3 依赖注入(inject)与 Ninject 2.2 + 全局 Action 过滤器

转载 作者:行者123 更新时间:2023-12-04 09:28:23 26 4
gpt4 key购买 nike

我正在尝试使用 ASP.NET MVC 3 和 Ninject 2.2 将记录器对象注入(inject)自定义 ActionFilterAttribute。

如果我用自定义属性标记每个 Controller ,我就能让它工作。

但是,如果我从 Controller 中删除属性装饰并尝试使用全局操作过滤器,我将无法使其工作。

这是代码:

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

}
}

就像我提到的,如果我取消注释 Controller 中的 [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;

关于asp.net-mvc-3 - MVC 3 依赖注入(inject)与 Ninject 2.2 + 全局 Action 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5439921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com