C# 使用Castle Windsor将依赖项注入CustomAttribute

C# 使用Castle Windsor将依赖项注入CustomAttribute,c#,asp.net-mvc,dependency-injection,castle-windsor,action-filter,C#,Asp.net Mvc,Dependency Injection,Castle Windsor,Action Filter,在我的ASP.NETMVC应用程序中,我实现了一个自定义ActionFilter来授权用户 我使用CastleWindsor为所有控制器提供依赖注入,如下所示: protected virtual IWindsorContainer InitializeServiceLocator() { IWindsorContainer container = new WindsorContainer(); ControllerBuilder.Current.Se

在我的ASP.NETMVC应用程序中,我实现了一个自定义ActionFilter来授权用户

我使用CastleWindsor为所有控制器提供依赖注入,如下所示:

  protected virtual IWindsorContainer InitializeServiceLocator()
    {
        IWindsorContainer container = new WindsorContainer();
        ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));

        container.RegisterControllers(typeof(HomeController).Assembly);
        ComponentRegistrar.AddComponentsTo(container);

        ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container));

        return container;
    }
在CustomAttribute中,我需要一个所有控制器都使用的依赖项,但是我无法在属性中使用基于构造函数的注入


那么,这里最干净的出路是什么?如何提供依赖关系?

您不能。属性是元数据。将行为纳入其中是错误的。放置依赖项甚至更糟糕

使用属性作为标记来表示要对其应用行为并在其他位置实现行为的对象


在MVC中,其他地方通常指使用属性中的数据来提供所需行为的自定义操作调用程序。

好的-这似乎是一个已回答的重复项

还有


通读了以上内容和参考文章后,我的重点是其他感兴趣的人。

不要把行为放在属性中…IMHO的最佳答案可能重复在这里(在这个问题本身中-非常好的示例(提示:
IFilterProvider
).好的-然后请解释一下我所做的和这篇文章之间的区别:另外-这个答案提供了批评,但没有给出任何解决方案。。。“其他地方?”请具体说明。您将如何在许多控制器上实现应用程序中需要依赖关系的授权?我不得不用一个大的向上投票否决向下投票。一张图片能表达千言万语。好吧——我再说一遍——一个合理的答案提供了一个解决方案。引用文章:“授权过滤器用于实现控制器操作的身份验证和授权。”我的授权实现需要一个外部依赖项。如果你不认为它应该被注入属性中,那么就提供一个可行的替代方案——或者不参与讨论。Krzysztof我理解你的观点,但请让我们知道你对“在别处实施行为”的想法。您是指在sutekishop中实现的解决方案(请参阅AuthenticateAttribute+AuthenticateAFilter)?由于反模式,该解决方案看起来不像Bony在下一个答案中建议的那样干净。。。我也在使用它,到目前为止,我有点高兴。但请Krzysztof告诉我们更多关于我们在这里遗漏了什么:我真的很想充分理解你的观点