/// <summary> /// Gibt eine Instanz einer registrierten Komponente zurück. /// </summary> /// <param name="registration">Komponentenregistrierung</param> /// <returns>Komponenten-Instanz</returns> internal object GetComponentInstance(ComponentRegistration registration) { // Wenn keine Komponentenregistrierung angegeben wurde ... if (registration == null) { // Ausnahme werfen throw new ArgumentNullException("registration"); } // Aktivierungsart auswerten switch (registration.ActivationType) { case ActivationType.SingleCall: // SingleCall-Aktivierung // Wenn eine Initialisierungsfunktion angegeben wurde ... if (registration.InitializationHandler != null) { // Komponenteninstanz von Inizialisierungsfunktion erzeugen lassen return(registration.InitializationHandler()); } else { // Komponenteninstanz erzeugen return(Activator.CreateInstance(registration.ImplementationType)); } case ActivationType.Singleton: // Singleton-Aktivierung // Wenn noch keine Singleton-Instanz existiert ... if (registration.SingletonInstance == null) { lock (registration.SyncLock) { // Wenn die Singleton-Instanz nicht bereits durch einen anderen Thread erzeugt wurde ... if (registration.SingletonInstance == null) { // Wenn eine Initialisierungsfunktion angegeben wurde ... if (registration.InitializationHandler != null) { // Singleton-Instanz mittels Inizialisierungsfunktion erzeugen registration.SingletonInstance = registration.InitializationHandler(); } else { // Singleton-Instanz erzeugen registration.SingletonInstance = Activator.CreateInstance(registration.ImplementationType); } } } } // Singleton-Instanz zurückgeben return(registration.SingletonInstance); } // Ausnahme werfen throw new NullReferenceException(); }
/// <summary> /// Returns an instance of a specified registered component. /// </summary> /// <param name="registration">Component registration</param> /// <returns>Component instance</returns> public object GetComponentInstance(ComponentRegistration registration) { if (registration == null) { throw new ArgumentNullException("registration"); } switch (registration.ActivationType) { case ActivationType.SingleCall: object instance = null; if (registration.InitializationHandler != null) { instance = registration.InitializationHandler(); } else { instance = Activator.CreateInstance(registration.ImplementationType); } // attach event handlers registration.EventStub.WireTo(instance); return(instance); case ActivationType.Singleton: if (registration.SingletonInstance == null) { lock (registration.SyncLock) { if (registration.SingletonInstance == null) { if (registration.InitializationHandler != null) { registration.SingletonInstance = registration.InitializationHandler(); } else { registration.SingletonInstance = Activator.CreateInstance(registration.ImplementationType); } // attach event handlers registration.EventStub.WireTo(registration.SingletonInstance); } } } return(registration.SingletonInstance); } throw new InvalidOperationException("Component instance couldn't be created."); }