Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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

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
C# Ninject和MVC3:操作过滤器的依赖项注入_C#_Asp.net Mvc 3_Ninject_Webactivator - Fatal编程技术网

C# Ninject和MVC3:操作过滤器的依赖项注入

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

我发现了大量关于如何使用Ninject在ASP.NET MVC3中的ActionFilter上进行属性注入的非结论性文章和问题

有人能给我举个清楚的例子吗

这是我的自定义auth属性

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