C# Ninject和MVC3:操作过滤器的依赖项注入
我发现了大量关于如何使用Ninject在ASP.NET MVC3中的ActionFilter上进行属性注入的非结论性文章和问题 有人能给我举个清楚的例子吗 这是我的自定义auth属性C# Ninject和MVC3:操作过滤器的依赖项注入,c#,asp.net-mvc-3,ninject,webactivator,C#,Asp.net Mvc 3,Ninject,Webactivator,我发现了大量关于如何使用Ninject在ASP.NET MVC3中的ActionFilter上进行属性注入的非结论性文章和问题 有人能给我举个清楚的例子吗 这是我的自定义auth属性 public class CustomAuthorizeAttribute : AuthorizeAttribute { [Inject] public IService Service { get; set; } [Inject] public IAuthenticationHe
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
[Inject]
public IService Service { get; set; }
[Inject]
public IAuthenticationHelper AuthenticationHelper { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
//My custom code
}
}
我正在使用WebActivator设置Ninject
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyProject.Web.AppStart_NinjectMvc3), "Start")]
namespace MyProject.Web {
public static class AppStart_NinjectMvc3 {
public static void RegisterServices(IKernel kernel) {
//Binding things
}
public static void Start() {
// Create Ninject DI Kernel
IKernel kernel = new StandardKernel();
// Register services with our Ninject DI Container
RegisterServices(kernel);
// Tell ASP.NET MVC 3 to use our Ninject DI Container
DependencyResolver.SetResolver(new NinjectServiceLocator(kernel));
}
}
}
我的服务人员和助手从不注射。我需要更改什么?以下是您可以继续操作的方法:
public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication
{
private class MyModule : NinjectModule
{
public override void Load()
{
Bind<IService>().To<ServiceImpl>();
Bind<IAuthenticationHelper>().To<AuthenticationHelperImpl>();
}
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
protected override IKernel CreateKernel()
{
var modules = new INinjectModule[] {
new MyModule()
};
var kernel = new StandardKernel(modules);
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
return kernel;
}
}
以及一个用它装饰的控制器动作:
[CustomAuthorize]
public ActionResult Index()
{
return View();
}
并且应该注入依赖项。在我看来,有一个比使用过滤器属性更好的解决方案。请参阅我的博客文章,了解使用Ninject声明过滤器的另一种方法。它不需要属性注入,而是使用构造函数注入:
DependencyResolver.SetResolver(新的NinjectDependencyResolver(内核))代码>-此行不是必需的。Ninject HttpApplication在应用程序_Start
中注册依赖解析程序
。Ninject开发了自己的做事方式,这与微软的努力直接矛盾,这让人很恼火,但这是可行的。谢谢,非常感谢,这很有帮助。
[CustomAuthorize]
public ActionResult Index()
{
return View();
}