У меня есть некоторые компоненты моей службы WCF, которые я хочу использовать; однако я хочу, чтобы служба запускалась на основе сеанса (в случае, если один сеанс создает исключение, которое прерывает его для остальных абонентов)
Сейчас мой контракт на обслуживание настроен так:
[ServiceBehavior(
ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.Single
)]
Если у меня есть потокобезопасные одноэлементные компоненты, такие как Loggers, которые я хочу использовать для всех сеансов; как я могу сделать WCF, который не является единственным экземпляром в начале (за сеанс предпочтительно), но имеет внутренние компоненты, которые являются одиночными экземплярами (например, ведение журнала, доступ к данным и т.д.).
если вы уже используете какую-либо инфраструктуру инъекций зависимостей - пусть она контролирует время жизни объекта для вас. Зарегистрируйте регистратор и объекты доступа к базе данных с единичной областью действия экземпляра и разрешите в своей службе wcf при каждом вызове - каждый раз вы получите один и тот же экземпляр.
Если вы контролируете время жизни своих объектов вручную - создавайте логгеров и объекты доступа к базам данных как одиночные (или создавайте родительскую однопользовательскую службу) и получаете доступ к своему экземпляру в службе wcf. В этом случае будьте осторожны, чтобы избежать опрокидывания устройства обслуживания.
Сама служба WCF в обоих случаях может быть настроена как InstanceContextMode.PerCall или PerSession.