gpt4 book ai didi

asp.net-mvc - 如何解决 MVC 过滤器属性中的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 23:29:02 24 4
gpt4 key购买 nike

我有一个从 AuthorizationAttribute 派生的自定义属性类,它对 Controller 操作执行自定义安全性。 OnAuthorizationCore 方法依赖于各种其他组件(例如 DAL),以判断用户是否可以调用操作。

我正在使用 Autofac 进行依赖注入(inject)。 ExtensibleActionInvoker 声称能够在 Action 过滤器上执行属性注入(inject)。在运行时设置属性的属性(这似乎是个坏主意)将在简单的单元测试中起作用,但在繁忙的多线程 Web 服务器中它必然会出错,因此这种想法似乎是一种反模式。因此这个问题:

如果我的 AuthorizationAttribute 依赖于其他组件才能正常工作,那么为了实现这一点,正确的 [架构] 模式是什么?

即 AuthorizationAttribute 取决于 IUserRepository ...应该如何解决这种关系?

最佳答案

The ExtensibleActionInvoker claims to be able to perform property injection on action filters.



正确 - 但不要将操作过滤器与可能无法实现它们的属性混淆。在 ASP.NET MVC 中处理此问题的最简洁方法是拆分职责,即使 MVC 框架允许您将它们组合起来。

例如,使用一对类——一个只保存数据的属性类:
// Just a regular old attribute with data values
class SomeAttribute : Attribute { ... }

还有一个注入(inject)了依赖项的过滤器:
// Gets dependencies injected
class SomeFilter : IActionFilter { ... }
SomeFilter只使用获取 SomeAttribute 的典型方法通过 GetCustomAttributes() 来自 Controller 或操作方法的属性做任何需要的工作。

然后您可以使用 ExtensibleActionInvoker连接过滤器:
builder.RegisterControllers(...).InjectActionInvoker();
builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();
builder.RegisterType<SomeFilter>().As<IActionFilter>();

它可能比使用属性作为过滤器方法编写的代码多一点,但从长远来看,代码的质量会更好(例如,通过避免属性的限制和服务定位器解决方案的尴尬) .)

关于asp.net-mvc - 如何解决 MVC 过滤器属性中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163217/

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