【问题标题】:Injecting dependency into CustomAttribute using Castle Windsor使用 Castle Windsor 将依赖项注入 CustomAttribute
【发布时间】:2023-03-23 15:12:01
【问题描述】:

在我的 ASP.Net MVC 应用程序中,我实现了一个自定义 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 中,我需要一个所有控制器都使用的依赖项,但是我无法在属性中使用基于构造函数的注入。

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

【问题讨论】:

标签: c# asp.net-mvc dependency-injection castle-windsor action-filter


【解决方案1】:
【解决方案2】:

你不能。属性是元数据。把行为放在他们身上是错误的。放上依赖就更糟糕了。

使用您的属性作为标记来表示您想要应用该行为并在其他地方实现该行为的对象。

在 MVC 中elsewhere 通常是指自定义操作调用程序,它使用属性中的数据来提供您需要的行为。

【讨论】:

  • 好的 - 然后请解释一下我在做什么和这篇文章之间的区别:asp.net/mvc/tutorials/understanding-action-filters-vb
  • 另外 - 这个答案提供了批评而没有真正给出任何解决方案......“其他地方?”请具体。您将如何实现在多个控制器上应用于整个应用程序并需要依赖项的授权?
  • 我不得不用一个很大的赞成票否决反对票。一张图说一千多个字。
  • 好的 - 我会再说一次 - 一个合理的答案提供了一个解决方案。引用文章:“授权过滤器用于实现控制器操作的身份验证和授权。”我的授权实现需要外部依赖。如果您不认为应该将它注入到属性中,那么请提供一个可行的替代方案 - 或者不要参与讨论。
  • 我必须同意 Bony。 Krzysztof 我理解您的意思,但请让我们知道您对“在其他地方实施行为”的想法。您是指在 sutekishop 中实现的解决方案(参见 AuthenticateAttribute+AuthenticateFilter)吗?由于反模式,该解决方案看起来不像 Bony 在下一个答案中建议的那样干净......我也在使用它,到目前为止我很高兴。但请 Krzysztof 详细说明我们在这里缺少什么:我真的很想完整理解您的观点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多