Weiter geht’s im Ninject Dojo!
Wie auch bei Spring.NET kann man bei Ninject definieren wie der Aktivierungsprozess abläuft und wie sich Ninject beim Injecten verhält.
Ninject bringt vier Activation Behaviors out-of-the-box mit
- TransientBehavior
- SingletonBehavior
- OnePerThreadBehavior
- OnePerRequestBehavior
TransientBehavior
Bei der Verwendung des TransientBehaviors erstellt Ninject bei jeder Anfrage eine neuen Instanz des gewählten Types.
SingletonBehavior
Ninject erstellt nur eine Instanz des besagten Typens und gibt diese immer wieder zurück.
OnePerThreadBehavior
Ninject erstellt pro Thread (System.Threading.Thread :) ) eine neue Instanz des Types.
OnePerRequestBehavior
Das OnePerRequestBehavior zielt auf die Web-Entwicklung hierbei wird eine Instanz beim HttpRequest erstellt, diese Instanz wird solange zurückgegeben bis der HttpRequest beendet ist.
Die Anwendung von ActivationBehaviors
Per default verwendet Ninject das TransientBehavior, welches wie bereits gesagt immer eine neue Instanz des gewählten Typs zurückliefert.
Um ein alternatives Behavior zu verwenden muss lediglich das MappingModule von Ninject mit Hilfe der Using-Methode erweitert werden, der Anwendungscode bleibt hiervon unberührt.
Die Ninject Behaviors befinden sich im Namespace Ninject.Core.Behavior, welcher sich in der Ninject.Core.dll befindet.
Das im vorherigen Ninject-Post erstellte MyTagMappingModule kann man also ganz einfach erweitern, so dass immer eine Singleton Instanz von IMediaDevice an alle Customer gebunden wird.
public class MyTagMappingModule : StandardModule
{
public override void Load()
{
Bind<IMediaDevice>().To<IPhone>();
#region SingletonBehavior
Bind<IMediaDevice>().To<WindowsPhone>().
Only(When.Context.Target.Tag == "Productive").
Using<SingletonBehavior>();
#endregion
Bind<IAddress>().To<InternationalAddress>();
Bind<IAddress>().To<NationalAddress>().
Only(When.Context.Target.Tag == "Productive");
}
}
Um das ganze Verhalten zu testen, habe ich nun einfach noch eine Konsolenausgabe in den Konstruktor der WindowsPhone Klasse hinzugefügt.
Zeile 1: Die Konstruktor Ausgabe der WindowsPhone Klasse
Wie Abbildung 1 zeigt, wird der Konstruktor der WindowsPhone Klasse nur einmal aufgerufen, auch wenn 2 Customer Instanzen erstellt werden.
Viel Spass beim Injecten
Technorati-Tags:
Ninject,
DI,
.NET