在 WCF 中使用 Unity 将依赖项注入到属性中

Posted

技术标签:

【中文标题】在 WCF 中使用 Unity 将依赖项注入到属性中【英文标题】:Injecting a dependency into an Attribute using Unity in WCF 【发布时间】:2015-03-21 05:20:12 【问题描述】:

我正在尝试编写一个身份验证属性以应用于 WCF 服务应用程序中的某些服务(使用 Unity 和 Unity.Wcf)。

身份验证由外部(服务应用程序)身份验证接口执行,该接口当前通过构造注入注入服务类并在每个服务方法中直接调用。

这导致每个服务方法中出现大量重复代码。

相反,我想将其移至属性。

但是,我需要在属性中可以访问身份验证接口。

显然,如果我在属性上使用构造注入,那么在使用属性装饰我的服务方法时,它是一个必需参数,但此时我无法访问它,因为它是由 Unity 连接的。

如何在我的属性中注入(或以其他方式访问)身份验证接口?

【问题讨论】:

要么退回到 Service Locator 并使属性成为 Humble Object,它仅代表它解析的服务,要么使属性被动,如 here 和 here 所述。 谢谢 Steven,我会阅读这些链接 我的观点基于Mark Seeman's book,因此我将服务定位器视为一种反模式。但是,如果 Steven 给出了答案而不是评论,我会投票支持指向 passive attributes 的链接。 您可以使用 WCF 扩展点在每个 wcf 请求上执行一些代码,而不是将依赖项注入到属性中 - 这是带有一些说明的 *** 文章:***.com/questions/4091384/… @DanKaufman 这正是我已经在做的——我需要在其中注入一个依赖项...... 【参考方案1】:

如果您已经在使用 Unity,我会使用 Unity 的 AOP 功能。面向方面的编程旨在允许代码的简单、DRY 实现来处理横切关注点(如身份验证和授权)。这允许摆脱重复的代码,并将横切关注点与业务逻辑分离。您可以轻松地将依赖项注入使用 Unity 创建的方面,因为它们是在运行时从容器中解析的(动态拦截)。

要使用统一创建方面,只需实现IInterceptionBehavior 接口并将其应用于您在容器注册期间不会装饰的服务(说明here)。

在方面中,您可以轻松读取应用于被拦截方法的所有属性,以便您可以将您需要满足的身份验证场景的角色放入属性中(但没有行为)。

我创建了一个demo solution 来解释 AOP,它使用 CastleWindsor 而不是 Unity,但适用相同的原则。

【讨论】:

以上是关于在 WCF 中使用 Unity 将依赖项注入到属性中的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Unity 将依赖项注入 ASP.NET Web API 控制器

WCF 自定义行为的依赖注入

如何在Signal I hub的Unity IoC容器中注入依赖项?

用于依赖注入的 MVC Web API 和 Unity

运用Unity实现依赖注入[结合简单三层实例]

运用Unity实现依赖注入[有参构造注入]