Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF中使用Unity将依赖项注入属性_C#_Wcf_Dependency Injection_Attributes_Unity Container - Fatal编程技术网

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

C# 在WCF中使用Unity将依赖项注入属性,c#,wcf,dependency-injection,attributes,unity-container,C#,Wcf,Dependency Injection,Attributes,Unity Container,我正在尝试编写一个身份验证属性,以应用于WCF服务应用程序中的某些服务(使用Unity和Unity.WCF) 身份验证由外部(到服务应用程序)身份验证接口执行,该接口当前通过构造注入到服务类中,并在每个服务方法中直接调用 这导致每个服务方法中都有大量重复的代码 相反,我想将其移动到一个属性 但是,我需要在属性中访问身份验证接口 显然,如果我在属性上使用构造注入,那么在用属性装饰我的服务方法时,它是一个必需的参数,但此时我无法访问它,因为它是由Unity连接的 如何在我的属性中插入(或以其他方式访

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

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

这导致每个服务方法中都有大量重复的代码

相反,我想将其移动到一个属性

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

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


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

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

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

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


我创建了一个用于解释AOP的方法,它使用CastleWindsor而不是Unity,但使用相同的原则

或者退回到服务定位器并使属性a仅代表它解析的服务,或者使属性被动,如所解释和所述。感谢Steven,我将阅读这些链接我的观点,因此我将服务定位器视为反模式。但是如果Steven给出的是答案而不是评论,我会把它选为指向的链接。而不是在属性中注入依赖项,您可以使用WCF扩展点在每个WCF请求上执行一些代码-下面是一篇stackoverflow文章,其中包含一些说明:@DanKaufman这正是我正在做的-我需要在其中注入依赖项。。。