作者:我是王健值得信赖 | 来源:互联网 | 2023-07-13 21:35
您应该完全避免将依赖项注入到属性中。本文中对此原因进行了解释:属性中的依赖注入:请勿这样做!。总而言之,本文解释说:
- 构造函数的注入是不可能的,因为Attribute实例的创建不能被拦截。CLR处于控制之中。
- 属性注入的使用很脆弱,因为它会导致时间耦合,应该避免。
- 将依赖项注入属性使得无法验证容器配置的正确性。
- 像MVC和Web API这样的框架缓存了属性,这使得很容易意外地创建引起错误的俘获依赖性。
您有两种选择:
- 通过将数据(属性)从其行为(服务)中分离出来,使属性变为被动状态,如参考文章和Mark Seemann的相关文章中所述。
- 如本答案所述,将您的属性转换为不起眼的对象。这意味着您:
- 从属性提取所有逻辑到包含所有依赖项的自定义服务中。
- 在您的容器中注册该服务。
- 让属性的方法(
AuthorizeCore
根据您的情况)只需要从服务定位器/ DependencyResolver解析服务并调用服务的方法即可。这里要注意的重要一点是,您不能进行构造函数注入,属性注入,并且服务不能以属性私有状态存储(如您已经注意到的)。
使用哪个选项:
- 如果您非常希望保持设计整洁,或者您需要使用这种方式应用多个属性,或者要应用的属性是在不依赖于system.web的程序集中定义的,请使用选项1。 .Mvc。
- 否则,请使用选项2。