Я не знаю супер простого способа получения экземпляров службы для совместного использования свойства, но вы могли бы создать собственный хост, производный от 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
, вы можете сделать это любым типом, который вам нужен ... но если сделать его ссылочным типом, который сам по себе имеет свойства, это означает, что вы можете использовать его, чтобы использовать столько свойств, сколько вам нужно.Обратите внимание, что с любым общим состоянием у вас будут условия защиты для защиты.
Я сделал службу 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;