如何在本地计算机上安装的多个WCF服务之间共享属性



我有一个托管多个WCF服务的Windows服务。所有这些都在本地计算机上运行(使用namepipe(。
是否有一种简单的方法可以让这些WCF服务共享财产?(我宁愿不让他们共享文件(。
我需要这个,因为每个WCF服务中的每个会话都将在给定的硬件上搁置,而其他WCF服务需要知道仍然可以使用的内容才能实例化另一个会话。

每个WCF服务都实现了不同的协议,这就是为什么我不合并很多协议的原因。每个主机都会有一个代理。

我不知道超级简单获取服务实例共享属性的方式,但是您可以创建一个自定义从Service主机派生并实现特定界面的主机,例如:

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();

...然后,在服务的A 运行实例中,您可以使用这样的共享状态:

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

在我有SharedState的地方,您可以将其制作到任何您想要的类型...但是将其作为本身具有属性的参考类型意味着您可以使用它来共享与您一样多的属性需要。请注意,使用任何共享状态,您都将拥有竞赛条件来保护。

我以相同的方式完成了Windows服务(多种不同的WCF服务类型(...这是它们如何共享状态的方式。

编辑:

我不知道为什么我不早点考虑这个,但是共享状态的另一种好方法是使用单身人士。这可能比以前的方法更简单。我也有这种模式正在进行...出于某种不同的原因,但它也适用于共享状态:

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;

最新更新