У меня есть один путь обслуживание WCF, используя Закрепление MSMQ, которое активировано, используя Windows Activation Service в IIS 7.0.
Я - большой поклонник на NInject, таким образом, я использовал расширение NInject для WCF, который для типичного обслуживания HTTP WCF работал бы отлично.
Однако в БЫЛ, активируют услуги нет никакого трубопровода HTTP, таким образом, я не могу использовать InRequestScope, связывая мои типы потому что Система. Сеть. HttpContext. Ток пустой. Я изо всех сил пытаюсь найти альтернативу, когда использование БЫЛО, это даст мне, что я хочу. Признак способа AspCompatibility не работает в этом способе также.
Я думал, что InThreadScope мог бы работать, но обслуживание создано в отдельной нити, чем, в чем это выполнено.
Так в основном мне нужен эквивалент HttpContext для WCF+WAS, чтобы рассмотреть мои объекты на уровне запроса. Есть ли некоторый статический объект в этом мире, который работал бы тот же путь, или у кого-либо еще есть какие-либо идеи о чем-то, что я могу взломать вместе?
Я реализовал свои собственные расширения WCF для Ninject 2.0, прежде чем я знал, что это это на Github. Моя реализация слегка отличается, но я придумал решение для обшивки объектов:
using System;
using Ninject.Activation;
namespace Ninject.Contrib.Wcf {
/// <summary>
/// Defines Scope Callbacks for WCF Context.
/// </summary>
public class NinjectWcfScopeCallbacks {
/// <summary>
/// Defines WCF Context scope.
/// </summary>
public static readonly Func<IContext, object> WcfContext =
ctx => (System.ServiceModel.OperationContext.Current != null
? System.ServiceModel.OperationContext.Current.
InstanceContext.
Extensions.Find<NinjectInstanceContext>()
: null);
/// <summary>
/// Defines WCF Web Context scope.
/// </summary>
public static readonly Func<IContext, object> WcfWebContext =
ctx => System.ServiceModel.Web.WebOperationContext.Current;
}
}
для полноты, вот как я использую обратный вызов, определенный выше:
Bind<IHelloWorldService>()
.To<HelloWorldService>()
.InScope(NinjectWcfScopeCallbacks.WcfWebContext);
, которые не размещали услуги WCF в том, что не были уверены, если Вы бы использовали WCFWebContext
или WCFContext
, определенные выше, но вы можете попробовать их и увидеть. Если WebOperationContext
работает, то вы все настроете. В противном случае я нашел, что все сложнее. Вы отметиете, что фрагмент кода выше используется NinjectInStanceCtextext
класс, который прикреплен к работе
. Это класс, который я писал, который использует механизм Ninject 2.0 «Cache и Collect», который позволяет объектам быть детерминированным распоряженным. В основном, класс является реализацией IExtension
, которая представляет собой конструкцию WCF для присоединения практически всего к работе
. Этот класс также реализует Ninject IntififyWendizedised
интерфейс, который является тем, что обеспечивает поддержку детерминированной утилизации. Вот как выглядит определение класса:
/// <summary>
/// Defines a custom WCF InstanceContext extension that resolves service instances
/// using Ninject.
/// <remarks>
/// The custom InstanceContext extension provides support for deterministic disposal
/// of injected dependencies and service instances themselves by being hook into
/// Ninject's "cache and collect" mechanism (new in Ninject 2.0) for object life cycle
/// management. This allows binding object instances to the lifetime of a WCF context
/// and having them deterministically deactivated and disposed.
/// </remarks>
/// </summary>
public class NinjectInstanceContext :
IExtension<InstanceContext>, INotifyWhenDisposed {
}
Остальная часть моего расширения WCF для Ninject является таким же, как один на Github. То, что в основном происходит, состоит в том, что поставщик экземпляра создан, который подключен к цепочке WCF «активации» - я не использую их конкретную терминологию, только то, как я понимаю вещи. Итак, идея состоит в том, что поставщик вашего экземпляра должен поставлять экземпляры запрошенного класса обслуживания WCF. Итак, вот где мы используем Ninject для получения экземпляра обслуживания. При этом мы также можем активировать и вводить какие-либо зависимости. То, что провайдер экземпляра в моей реализации, охватывает ядро Ninject в экземпляре NinjectInStanceCtextext
и прикрепите его к работе applayContext
. Создание службы затем делегируется на это расширение WCF. Когда провайдера экземпляра сообщает выпустить сервис, то NinjectinStanceTanceTextext
, который был прикреплен к операционному элементам , который был прикреплен к операцииContextext, который посредством реализации inotifywhenceSplised
вызывает детерминированное утилизацию сервиса (и потенциально его зависимостей ).
Надеюсь, это обсуждение помогает. Я посмотрю, смогу ли я получить более конкретный код, размещенный здесь, если вы заинтересованы.
Я уверен, что Операция "Контекст"
- это то, что вы ищете