При создании сервисов порой хочется чтобы из любого места серверного кода можно было получать определенную информацию, например прикладные данные пользователя, какие то данные контекста выполнения. При этом привязать этот контекст хочется к OperationContext.
WCF предоставляет средства расширения, которые позволяют добавлять свои расширения к некоторым инфраструктурным элементам. Подробнее про расширяемость WCF можно почитать тут. Расскажу о том, как привязать к OperationContext свой собственный контекст выполнения.
Шаг 1. Реализовываем класс-расширение.
Для реализации класса, который будет хранить наш контекст, необходимо реализовать интерфейс IExtension. Данный интерфейс позволяет расширять возможности некоторых инфраструктурных элементов WCF, например, OperationContext. Реализовать необходимо два метода: Attach и Detach.
1: using System.ServiceModel;
2:
3: namespace ContextExtentionSample
4: {
5: public class ContextExtention : IExtension<OperationContext>
6: {
7: // custom data...
8:
9: #region IExtension<OperationContext> Members
10:
11: public void Attach(OperationContext owner)
12: {
13: // attach to OperationCompleted to destroy context
14: owner.OperationCompleted += new EventHandler(delegate (object sender, EventArgs args)
15: {
16: this.Detach((OperationContext)sender);
17: });
18: }
19:
20: public void Detach(OperationContext owner)
21: {
22: // free context data
23: }
24: #endregion
25: }
26: }
Шаг 2. Реализовываем привязку к OperationContext.
При инициализации вашего контекста необходимо означить контекст для OperationContext.
1:ContextExtention extention;
2:extention = new ContextExtention(user.Id, gropIds);
3:OperationContext.Current.Extensions.Add(extention);
Шаг 3. Использвование контекста.
Получить контекст достаточно просто, для этого необходимо просто обратиться к OperationContext следующим образом:
1:OperationContext.Current.Extensions.Find<ContextExtention >()
В итоге, получится контекст, который можно получить в любом месте выполнения операций сервиса начиная от инициализации этого контекста и заканчивая завершением операции (уничтожением OperationContext).
В следующей статье расскажу как расширять InstanceContext.