Альтернатива HttpContext, используя NInject со Службой WCF, Принятой в, использовала закрепление MSMQ

У меня есть один путь обслуживание WCF, используя Закрепление MSMQ, которое активировано, используя Windows Activation Service в IIS 7.0.

Я - большой поклонник на NInject, таким образом, я использовал расширение NInject для WCF, который для типичного обслуживания HTTP WCF работал бы отлично.

Однако в БЫЛ, активируют услуги нет никакого трубопровода HTTP, таким образом, я не могу использовать InRequestScope, связывая мои типы потому что Система. Сеть. HttpContext. Ток пустой. Я изо всех сил пытаюсь найти альтернативу, когда использование БЫЛО, это даст мне, что я хочу. Признак способа AspCompatibility не работает в этом способе также.

Я думал, что InThreadScope мог бы работать, но обслуживание создано в отдельной нити, чем, в чем это выполнено.

Так в основном мне нужен эквивалент HttpContext для WCF+WAS, чтобы рассмотреть мои объекты на уровне запроса. Есть ли некоторый статический объект в этом мире, который работал бы тот же путь, или у кого-либо еще есть какие-либо идеи о чем-то, что я могу взломать вместе?

11
задан Ray Wits 12 January 2010 в 04:22
поделиться

2 ответа

Я реализовал свои собственные расширения 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 вызывает детерминированное утилизацию сервиса (и потенциально его зависимостей ).

Надеюсь, это обсуждение помогает. Я посмотрю, смогу ли я получить более конкретный код, размещенный здесь, если вы заинтересованы.

9
ответ дан 3 December 2019 в 10:26
поделиться

Я уверен, что Операция "Контекст" - это то, что вы ищете

.
0
ответ дан 3 December 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: