在WCF服务应用程序中使用Unity传递客户端上下文

时间:2011-10-12 19:46:17

标签: wcf dependency-injection inversion-of-control unity-container ioc-container

我有一个WCF服务应用程序(实际上,它使用WCF Web API预览5)拦截每个请求并提取从客户端传递的几个标头值。我们的想法是'拦截器'将提取这些值并设置一个ClientContext对象,然后在请求期间在应用程序中全局可用。服务器是无状态的,因此上下文是每次调用。

我的问题是应用程序使用IoC(Unity)进行依赖注入,因此不使用单例等。任何需要使用上下文的类都通过DI接收它。

那么,我如何'动态'为每个请求创建一个新的上下文对象,并确保容器在该请求期间使用它?我还需要确保它完全是线程安全的,因为每个请求都是真正使用正确的实例。

更新

所以当我调查下面的建议时,我意识到我的问题的一部分是封装。我们的想法是,用于上下文的接口(IClientContext)仅包含只读属性,因此其余的应用程序代码无法进行更改。 (在团队开发环境中,如果代码允许,有人将不可避免地这样做。)

结果,在拦截请求的消息处理程序中,我可以从容器中获取实现接口的类型的实例,但我无法使用它。我仍然希望只向所有其他代码公开只读接口,但需要一种方法来设置属性值。有什么想法吗?

我正在考虑实现两个接口,一个提供只读访问,另一个允许我初始化实例。或者将已解析的对象强制转换为允许我设置值的类型。不幸的是,这也不是万无一失,但除非有人有更好的想法,否则我可以做到最好。

2 个答案:

答案 0 :(得分:1)

阅读Andrew Oakley's Blog on WCF specific lifetime managers。他创建了一个UnityOperationContextLifetimeManager:

  

我们提出了构建Unity生命周期管理器的想法   WCF的OperationContext。这样,我们的容器对象就会存在   仅在请求的生命周期内......

使用该生​​命周期管理器配置您的上下文类,然后解决它。它应该给你一个“操作单身人士”。

答案 1 :(得分:0)

听起来你需要Unity LifetimeManager。请参阅this SO questionthis MSDN article