簡體   English   中英

如何在本地計算機上安裝的多個WCF服務之間共享屬性?

[英]How to share a property between multiple WCF services installed on a local machine?

我有一個托管多個WCF服務的Windows服務。 它全部在本地計算機上運行(使用NamePipe)。
是否有一種簡單的方法可以使這些WCF服務共享屬性? (我希望他們不要共享文件)。
我需要這個,因為每個WCF服務中實例化的每個會話都將保留給定的硬件,而其他WCF服務則需要知道仍有哪些可用,以便能夠實例化另一個會話。
每個WCF服務都實現一個不同的協議,這就是為什么我沒有合並很多東西的原因。 每個主機都有一個代理。

我不知道讓服務實例共享屬性的超級簡單方法,但是您可以創建一個派生自ServiceHost的自定義主機,並使其實現特定的接口,例如:

public interface ISharedStateContainer
{
  SharedState State { get; set; }
}

必須知道此接口的服務。 然后,在Windows服務項目中,您可以創建一個自定義服務主機:

public class CustomServiceHost: ServiceHost, ISharedStateContainer
{
   SharedState state;
   public SharedState State{ get{ return state; } set{ state=value; } }       
}

...然后Windows服務創建wcf服務主機實例時,它可以注入共享狀態:

var sharedState = new SharedState();

myServiceHost = new CustomServiceHost( typeof( MyService ) );
((ISharedStateContainer) myServiceHost).State = sharedState;

myOtherHost = new CustomServiceHost( typeof( OtherService ) );
((ISharedStateContainer) myOtherHost).State = sharedState;

myServiceHost.Open();
myOtherHost.Open();

...然后在正在運行的服務實例中,您可以進入共享狀態,如下所示:

var sharedState = ((ISharedStateContainer)OperationContext.Current.Host).State

在擁有SharedState ,可以將其設置為所需的任何類型...但是將其設置為本身具有屬性的引用類型意味着您可以使用它來共享所需的多個屬性。 請注意,在任何共享狀態下,您都將具有防止競爭的競爭條件。

我已經以相同的方式(多種不同的WCF服務類型)完成了Windows服務...這差不多就是它們共享狀態的方式。

編輯:

我不知道為什么我不早考慮這一點,但是共享狀態的另一種好方法是使用單例。 這可能比以前的方法更直接。 我也正在繼續這個模式...出於某種不同的原因,但它也適用於共享狀態:

public class SharedState
{
  //--> singleton instance...
  static readonly SharedState current;

  //--> use static initializer to create the current instance...
  static SharedState( )
  {
    current = new SharedState();
  }

  //--> hide ctor...
  private SharedState(){}

  public static SharedState Current
  {
    get { return current; }
  }

  //--> all your shared state instance methods and properties go here...

  public string SomeString
  {
    get
    {
      return //...
    }
  }

}

...然后您可以從服務中的任何位置訪問此對象,甚至可以從不在客戶端操作的上下文中運行的代碼訪問。 我將其用於服務需要定期執行的長期運行的后台任務,但是共享屬性非常簡單:

var someValue = SharedState.Current.SomeString;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM