none
请教一个问题,wcf中的OperationContext.Current是怎么实现的呢? 可能是一个OOP的问题 RRS feed

  • 问题

  • 在wcf中,自己写的services方法里可以通过调用OperationContext这个类的静态属性Current来获得当前执行的上下文信息

    这明明是一个静态属性,可是在不同的类实例中却有不同的表现,也就是一种多态.

    请问这是怎么设计的呢?有没有高手能讲解一下??
    2010年11月10日 1:49

答案

  • 我把你的问题发到WCF英文论坛了,Steven 给了回复。我看有点意思。

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/827b649a-600d-441c-9a97-99fd35c6f39b/?prof=required

    Hi Frank,

    I think providing a Current static member is to simplify the access of the OperationContext associated with the current operation processing pipeline/context. Just like the HttpContext.Current property used in ASP.NET web application, through this property is static, the actually implementation code of this property will look into the context storage(such as the TLS of current thread) to acquire the correct OperationContext/HttpContext associated with the current thread/context.  Therefore, such kind of "static" member is still thread safe when being called in different threads. For example, if you call this property in a background thread where the OperationContext or HttpContext is not associated, this property will return null.



    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    • 已标记为答案 Mog Liang 2010年11月17日 6:59
    2010年11月15日 9:15
    版主

全部回复

  • 移動我貼子干嘛喲,operationcontext只是打個比方,又不是特指wcf,像asp.net里的session也一樣啊,這就是一個.net oop的問題,不在NET Framework 一般性问题讨论区討論上哪討論嘛
    2010年11月11日 1:26
  • 呵呵 这个应该是个类的设计问题 移动一下会获得更多帮助

    据我所知 这个是一个单例模式 楼主不妨通过 导航定义 看一下


    stay hungry stay foolish
    2010年11月11日 1:50
    版主
  • 不可能是单例吧

    怎么会是单例呢

    有多个客户端连我的服务,就肯定会产生多个上下文实例,为啥直接用operationcontext.current就能直接获取了呢?照oop和c#语言的定义,current是一个静态属性,不应该出现这种情况啊

    2010年11月11日 5:03
  • 不可能是单例吧

    怎么会是单例呢

    有多个客户端连我的服务,就肯定会产生多个上下文实例,为啥直接用operationcontext.current就能直接获取了呢?照oop和c#语言的定义,current是一个静态属性,不应该出现这种情况啊


    你好像在很多地方问道。

    我对这个问题也很好奇。希望能得到WCF设计人员的回答。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    2010年11月12日 6:35
    版主
  • 就我所理解,Context模式常出现在Pipeline的架构里。比如OperationContext之WCF pipeline, HttpContext之Asp.net pipeline。这样做的好处是pipeline的每个模块可以维护自己的数据,而且又可以通过Context与其他模块共享数据,同时,有保持模块的弱耦合。实现的一种方式,是把数据存放到线程上,比如用[ThreadStatic],但是WCF究竟如何实现的,我也不清楚,反正不是用的ThreadStatic。

     

    2010年11月15日 2:31
  • 看了下源碼,current這是一個線程靜態變量,也就是說,每一個實例上下文都是獨占一個線程??

    沒時間深入,希望有牛人搞一搞,mark

    2010年11月15日 2:32
  • ThreadStatic 這玩意在別非托管語言像C,C++里有這個概念嗎?...

     

    基礎沒學好啊...

    2010年11月15日 2:34
  • 我把你的问题发到WCF英文论坛了,Steven 给了回复。我看有点意思。

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/827b649a-600d-441c-9a97-99fd35c6f39b/?prof=required

    Hi Frank,

    I think providing a Current static member is to simplify the access of the OperationContext associated with the current operation processing pipeline/context. Just like the HttpContext.Current property used in ASP.NET web application, through this property is static, the actually implementation code of this property will look into the context storage(such as the TLS of current thread) to acquire the correct OperationContext/HttpContext associated with the current thread/context.  Therefore, such kind of "static" member is still thread safe when being called in different threads. For example, if you call this property in a background thread where the OperationContext or HttpContext is not associated, this property will return null.



    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    • 已标记为答案 Mog Liang 2010年11月17日 6:59
    2010年11月15日 9:15
    版主