/// <summary> /// Invoked by the kernel when one of registered dependencies were satisfied by new components registered. /// </summary> /// <remarks> /// Handler for the event <see cref = "IKernelEvents.HandlerRegistered" /> /// </remarks> /// <param name = "stateChanged"> </param> protected void DependencySatisfied(ref bool stateChanged) { var missing = missingDependencies; if (missing == null) { // handled on another thread? return; } // Check within the Kernel foreach (var dependency in missing.ToArray()) { if (AddResolvableDependency(dependency)) { missing.Remove(dependency); } } if (AllRequiredDependenciesResolvable()) { SetNewState(HandlerState.Valid); stateChanged = true; DisconnectEvents(); // We don't need these anymore missingDependencies = null; } }
protected void AddMissingDependency(DependencyModel dependency) { var missing = missingDependencies; if (missing == null) { var @new = new SimpleThreadSafeSet <DependencyModel>(); missing = Interlocked.CompareExchange(ref missingDependencies, @new, null) ?? @new; } missing.Add(dependency); if (state != HandlerState.WaitingDependency) { // This handler is considered invalid // until dependencies are satisfied SetNewState(HandlerState.WaitingDependency); // Register itself on the kernel // to be notified if the dependency is satified Kernel.HandlersChanged += DependencySatisfied; // We also gonna pay attention for state // changed within this very handler. The // state can be changed by AddCustomDependencyValue and RemoveCustomDependencyValue } }
/// <summary> /// Saves the kernel instance, subscribes to <see cref = "IKernelEvents.AddedAsChildKernel" /> event, creates the lifestyle manager instance and computes the handler state. /// </summary> /// <param name = "kernel"> </param> public virtual void Init(IKernelInternal kernel) { if (kernel == null) { throw new ArgumentNullException("kernel"); } this.kernel = kernel; this.kernel.AddedAsChildKernel += OnAddedAsChildKernel; InitDependencies(); if (AllRequiredDependenciesResolvable()) { SetNewState(HandlerState.Valid); DisconnectEvents(); missingDependencies = null; } }
/// <summary> /// Invoked by the kernel when one of registered dependencies were satisfied by new components registered. /// </summary> /// <remarks> /// Handler for the event <see cref = "IKernelEvents.HandlerRegistered" /> /// </remarks> /// <param name = "stateChanged"> </param> protected void DependencySatisfied(ref bool stateChanged) { var missing = missingDependencies; if (missing == null) { // handled on another thread? return; } // Check within the Kernel foreach (var dependency in missing.ToArray()) { if (AddResolvableDependency(dependency)) { missing.Remove(dependency); } } if (AllRequiredDependenciesResolvable()) { SetNewState(HandlerState.Valid); stateChanged = true; DisconnectEvents(); // We don't need these anymore missingDependencies = null; } }
protected void AddMissingDependency(DependencyModel dependency) { var missing = missingDependencies; if (missing == null) { var @new = new SimpleThreadSafeSet<DependencyModel>(); missing = Interlocked.CompareExchange(ref missingDependencies, @new, null) ?? @new; } missing.Add(dependency); if (state != HandlerState.WaitingDependency) { // This handler is considered invalid // until dependencies are satisfied SetNewState(HandlerState.WaitingDependency); // Register itself on the kernel // to be notified if the dependency is satified Kernel.HandlersChanged += DependencySatisfied; // We also gonna pay attention for state // changed within this very handler. The // state can be changed by AddCustomDependencyValue and RemoveCustomDependencyValue } }
/// <summary> /// Saves the kernel instance, subscribes to <see cref = "IKernelEvents.AddedAsChildKernel" /> event, creates the lifestyle manager instance and computes the handler state. /// </summary> /// <param name = "kernel"> </param> public virtual void Init(IKernelInternal kernel) { if (kernel == null) { throw new ArgumentNullException("kernel"); } this.kernel = kernel; this.kernel.AddedAsChildKernel += OnAddedAsChildKernel; InitDependencies(); if (AllRequiredDependenciesResolvable()) { SetNewState(HandlerState.Valid); DisconnectEvents(); missingDependencies = null; } }