我正在尝试编写一个身份验证属性以应用于 WCF 服务应用程序中的某些服务(使用 Unity 和 Unity.Wcf)。
身份验证由外部(服务应用程序)身份验证接口(interface)执行,该接口(interface)目前通过构造注入(inject)注入(inject)到服务类中,并在每个服务方法中直接调用。
这导致在每个服务方法中有很多重复的代码。
相反,我想将其移至属性。
但是,我需要在属性中访问身份验证接口(interface)。
显然,如果我在属性上使用构造注入(inject),那么在使用属性装饰我的服务方法时它就是一个必需的参数,但此时我无法访问它,因为它是由 Unity 连接的。
如何在我的属性中注入(inject)(或以其他方式访问)身份验证接口(interface)?
最佳答案
如果您已经在使用 Unity,我会使用 Unity 的 AOP 功能。面向方面的编程旨在允许简单、DRY 的代码实现来处理横切关注点(如身份验证和授权)。这允许摆脱重复的代码,并将横切关注点与业务逻辑分离。您可以轻松地将依赖项注入(inject)使用 Unity 创建的方面,因为它们是在运行时从容器中解析的(动态拦截)。
要统一创建方面,只需实现 IInterceptionBehavior
接口(interface)并将其应用到您在容器注册期间不会装饰的服务(说明 here)。
在方面内,您可以轻松读取应用于被拦截方法的所有属性,因此您可以在属性中放置您需要满足身份验证场景的角色(但没有行为)。
我创建了一个 demo solution为了解释 AOP,它使用 CaSTLeWindsor 而不是 Unity,但适用相同的原则。
关于c# - 在 WCF 中使用 Unity 将依赖项注入(inject)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28088393/