5

Mein Fall ist es Ninject 2.Wie verwalte ich die Entsorgung von Objekten, wenn ich IoC verwende?

// normal explicit dispose 
using (var dc = new EFContext) 
{ 
} 

Aber manchmal brauche ich länger um den Kontext zu halten oder zwischen Funktionsaufrufen. Also ich möchte dieses Verhalten durch IoC-Bereich steuern.

// if i use this way. how do i make sure object is disposed. 
var dc = ninject.Get<IContext>() 

// i cannot use this since the scope can change to singleton. right ?? 
using (var dc = ninject.Get<IContext>()) 
{ 
} 

Beispieltive

Container.Bind<IContext>().To<EFContext>().InSingletonScope(); 
// OR 
Container.Bind<IContext>().To<EFContext>().InRequestScope(); 
+0

Duplizieren: http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc – TrueWill

+0

Danke für den Link – Aval

Antwort

3

Von dem, was ich weiß (ich habe vor etwa einem Monat recherchiert), unterstützt Ninject das Lifecycle Management überhaupt nicht. Castle Windsor und AutoFac (und zu einem gewissen Grad auch StructureMap, aber nur bei Verwendung von verschachtelten Containern) kümmern sich um die Entsorgung von Einwegkomponenten, die sie zu gegebener Zeit erstellen.

1

Wenn Sie die Kontrolle über die Schnittstelle von IContext haben, fügen Sie IDisposable auf der Liste der Schnittstellen, von denen es erbt. Wenn nicht, niedergeschlagenen die IContext Sie auf ein IDisposable bekommen ...

var context = ninject.Get<IContext>(); 

using ((IDisposable)context) 
{ 
} 

Sie haben auch die Möglichkeit, die Änderung der Schnittstelle von IContext dies durch die Zusammensetzung zu tun, wenn Sie IContext steuern ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

var context = ninject.Get<IContext>(); 

using (context.GetUsageHandle()) 
{ 
} 
+0

Dank. Was ist, wenn ich meinen Bereich im obigen Fall zu Singleton ändere? Es verfügt über. Richtig, beim nächsten Aufruf dieser Funktion bekommst du eine Ausnahme. – Aval

+0

@Aval: Richtig, deshalb möchten Sie die zweite Implementierung verwenden, bei der der Kontext etwas produziert, das nicht ein Singleton ist, der wegwerfbar ist. Besser noch, Sie können beginnen, indem Sie die zweite Implementierung nur das Einwegobjekt zurückgeben und dann zu einem Singleton mit Einweg-Fliehgewichten wechseln, ohne den Client zu beeinträchtigen. –

+0

danke, es hat mir wirklich geholfen. – Aval

1

Zusätzlich zu den Standardbereichen von Transient, OnePerThread und Singleton können Sie einen ActivationBlock verwenden, um die Lebensdauer einer ganzen Reihe von Objekten zu steuern. Wenn der Block entsorgt wird, gehen alle durch den Block abgerufenen Objekte außerhalb des Gültigkeitsbereichs - so werden Singletons und andere entsorgt, wenn ihre Instanzen vom Aktivierungsblock angefordert werden.

var kernel = new StandardKernel(); 
kernel.Bind<NotifiesWhenDisposed>().ToSelf(); 

NotifiesWhenDisposed instance = null; 
using(var block = new ActivationBlock(kernel)) 
{ 
    instance = block.Get<NotifiesWhenDisposed>(); 
    instance.IsDisposed.ShouldBeFalse(); 
} 

instance.IsDisposed.ShouldBeTrue(); 
Verwandte Themen