كان البديل ل httpContext عند استخدام ninject مع خدمة WCF المستضافة في استخدام MSMQ

StackOverflow https://stackoverflow.com/questions/2046704

  •  20-09-2019
  •  | 
  •  

سؤال

لدي خدمة WCF طريقة واحدة باستخدام ملزمة MSMQ التي يتم تنشيطها باستخدام خدمة تنشيط Windows في IIS 7.0.

أنا مروحة كبيرة على التطعيم، لذلك كنت أستخدم امتداد Ninject ل WCF، والتي من أجل خدمة WCF HTTP نموذجية تعمل بشكل رائع.

ومع ذلك، في تم تنشيط الخدمات، لا يوجد خط أنابيب HTTP، لذلك لا يمكنني استخدام InRequestScope عند ربط أنواعي لأن System.Web.httpcontext.current غير فارغ. أنا تكافح لإيجاد بديل عند استخدام كان ذلك سيعطيني ما أريد. سمة وضع ASPCompatibility لا تعمل في هذا الوضع أيضا.

اعتقدت أن IntheReadScope قد تعمل، ولكن يتم إنشاء الخدمة في مؤشر ترابط منفصل عن ما يتم تنفيذه فيه.

لذلك في الأساس أحتاج ما يعادل HttpContext ل WCF + هو النطاق كائناتي على مستوى الطلب. هل هناك بعض الكائن الثابت في هذا العالم يعمل بنفس الطريقة أو هل لدى أي شخص آخر أي أفكار حول شيء يمكنني الاختراق معا؟

هل كانت مفيدة؟

المحلول

لقد قمت بتنفيذ ملحقات WCF الخاصة بي ل Ninject 2.0 قبل أن أعرف أنه كان هناك هذه حتى على جيثب. يختلف تنفيذي قليلا، لكنني توصلت إلى حل لنعم كائنات:

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 يعمل، ثم أنت كل مجموعة. خلاف ذلك، وجدت أن الأمور أكثر تعقيدا بعض الشيء. سوف تلاحظ أن مقتطف الكود أعلاه يستخدم NinjectInstanceContext الطبقة التي تعلق على OperationContext. وبعد هذا فئة كتبت أنها تستخدم آلية "ذاكرة التخزين المؤقت وجمع" Ninject 2.0's والتي تسمح بالتخلص من الكائنات. أساسا، الطبقة هي تنفذ IExtension<InstanceContext> وهو بناء WCF لإرفاق أي شيء تقريبا OperationContext. وبعد هذه الفئة تنفذ أيضا ninject INotifyWhenDisposed الواجهة التي هي ما يوفر الدعم للتخلص المحدد. إليك ما يشبه تعريف الفصل:

  /// <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 هو نفسه واحد على جيثب. ما يحدث أساسا هو أن موفر مثيل يتم إنشاؤه وهو متصل بسلسلة "التنشيط" WCF - أنا لا أستخدم مصطلحاتها المحددة، فقط كيف أفهم الأشياء. لذلك، الفكرة هي أن موفر مثيلك من المفترض أن يوفر مثيلات من فئة خدمة WCF المطلوبة. لذلك، إليك هنا حيث نستخدم Ninject لإنتاج مثيل الخدمة. من خلال القيام بذلك، يمكننا أيضا تنشيط وحقن أي تبعيات. ما يفعله موفر المثيل في تطبيقي يختتم نواة Ninject في مثيل إذا NinjectInstanceContext وإرفاقه إلى OperationContext. وبعد ثم يتم تفويض إنشاء الخدمة إلى ملحق WCF هذا. عندما يقال موفر مثيل إطلاق الخدمة، NinjectInstanceContext التي تم إرفاقها بالثريات يتم التخلص منها والتي عن طريق التنفيذ INotifyWhenDisposed يسبب التخلص المحدد للخدمة (وربما تبعياتها).

نأمل أن تساعد هذه المناقشة. سأرى إذا كان بإمكاني الحصول على مزيد من التعليمات البرمجية الإلكترونية المنشورة هنا إذا كنت مهتما.

نصائح أخرى

أنا متأكد OperationContext هو ما تبحث عنه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top