2010-01-12 11 views
11

IIS 7.0'da Windows Etkinleştirme Hizmeti kullanılarak etkinleştirilen MSMQ Binding kullanarak tek yönlü bir WCF hizmetim var.Bir WCF hizmetiyle NInject kullanıldığında HttpContext için alternatif MSMQ bağını kullanarak WAS içinde barındırılan

NInject üzerinde büyük bir hayranıyım, bu yüzden WCF için NInject uzantısını kullanıyorum. Bu, normal bir HTTP WCF hizmeti için harika çalışıyor.

Ancak, WAS etkinleştirme hizmetlerinde HTTP boru hattı yok, bu yüzden System.Web.HttpContext.Current boş olduğundan, türlerimi bağlarken InRequestScope kullanamıyorum. İstediğimi bana verecek olan WAS'ı kullanırken bir alternatif bulmaya çalışıyorum. AspCompatibility modu özniteliği bu modda da çalışmaz.

Ben benim nesneleri InThreadScope işe yarayabilecek düşündüm ama hizmeti infaz olandan ayrı bir iş parçacığı oluşturulur.

Böylece temelde WCF için HttpContext eşdeğeri gerekir + kapsamına WAS istek seviyesi Bu dünyada aynı şekilde çalışacak bazı statik nesneler var mı, yoksa başkalarıyla bir araya getirebileceğim bir şey hakkında herhangi bir fikri var mı?

cevap

9

aradığınız eminim. Benim uygulanması biraz farklıdır, ama kapsam nesnelere bir çözüm geldi: WCF barındırılan değil

Bind<IHelloWorldService>() 
     .To<HelloWorldService>() 
     .InScope(NinjectWcfScopeCallbacks.WcfWebContext); 

: Bütünlüğü için

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; 
    } 
} 

, bu yukarıda tanımlanan geri arama nasıl kullanılacağı görülmektedir WAS hizmetlerinde, yukarıda açıklanmış olan WcfWebContext veya WcfContext'u kullanıp kullanmadığınızdan emin değilsiniz, ancak bunları deneyip deneyebilirsiniz. WebOperationContext çalışıyorsa, her şey hazır demektir. Aksi takdirde, işler biraz daha karmaşık buldum. Yukarıdaki kod snippet'inin OperationContext'a bağlı bir NinjectInstanceContext sınıfını kullandığını fark edeceksiniz. Bu, Nesnelerin deterministik olarak imha edilmesine izin veren Ninject 2.0'ın "önbellek ve toplama" mekanizmasını kullanan bir sınıftır. Temel olarak, sınıf, OperationContext'a neredeyse her şeyi eklemek için bir WCF yapısı olan IExtension<InstanceContext> uygular. Bu sınıf ayrıca Ninject'in deterministik imha için destek sağlayan INotifyWhenDisposed arayüzünü de uygular.

/// <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 { 
    } 

Ninject benim WCF uzantısı geri kalanı üzerinde github one aynıdır: Burada gibi sınıf tanımı görünüyor budur. Temel olarak, WCF "aktivasyon" zincirine takılan bir örnek sağlayıcının oluşturulmasıdır - belirli bir terminolojiyi kullanmıyorum, sadece bir şeyi nasıl anlarım. Yani, fikir, örnek sağlayıcınızın talep edilen WCF servis sınıfının örneklerini sağlamasıdır. Yani, hizmet örneğini üretmek için Ninject'i kullandığımız yer. Bunu yaparak, bağımlılıkları da aktive edebilir ve enjekte edebiliriz. Örnek sağlayıcımın uygulamamda yaptığı gibi, NinjectInstanceContext ise OperationContext'a iliştirilmiş bir örnekte Ninject çekirdeğini tamamlıyor. Hizmetin yaratılması daha sonra bu WCF uzantısına devredilir. Örnek sağlayıcının bir servisi serbest bırakması istendiğinde, OperationContext'e bağlı olan NinjectInstanceContext, INotifyWhenDisposed'un uygulanması yoluyla hizmetin deterministik bertaraf edilmesine (ve potansiyel olarak bağımlılıklarına) neden olan elden çıkarılır.

Bu tartışmanın yardımcı olacağını umarız.İlgilendiğinizde burada daha somut bir kod gönderilebileceğini göreceğim.

+1

Bağlantı bozuk. Bu doğru mu? https://github.com/ninject/ninject.extensions.wcf –

+0

Haklısınız - Bağlantıyı düzelttim. –

0

i OperationContext github orada bir this kadar olduğunu öğrenmeden önce ben Ninject 2.0 için kendi WCF uzantıları uyguladı ne

İlgili konular