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.
Bağlantı bozuk. Bu doğru mu? https://github.com/ninject/ninject.extensions.wcf –
Haklısınız - Bağlantıyı düzelttim. –