/// <summary> /// Add termination resource with <c>kind == ITerminationHandler</c> that will be invoked when lifetime termination starts /// (i.e. <see cref="LifetimeDefinition.Terminate"/> is called, <see cref="ExecutingCount"/> became zero, so status is set to <see cref="LifetimeStatus.Terminating"/>). /// Resources invocation order: LIFO /// All errors are logger by <see cref="ILog"/> so termination of each resource is isolated. /// /// Method returns do nothing and return `false` if <see cref="Status"/> ≥ <see cref="LifetimeStatus.Terminating"/>. /// </summary> /// <param name="disposable">Action to invoke on termination</param> /// <returns><c>true</c> if resource added - only status ≤ <see cref="LifetimeStatus.Canceling"/>. <c>false</c> if resource's not added - status ≥ <see cref="LifetimeStatus.Terminating"/> </returns> [PublicAPI] public bool TryOnTermination([NotNull] ITerminationHandler disposable) => Definition.TryAdd(disposable);
/// <summary> /// Add termination resource <c>kind == ITerminationHandler</c> that will be invoked by calling <see cref="ITerminationHandler.OnTermination"/> when lifetime termination start /// (i.e. <see cref="LifetimeDefinition.Terminate"/> is called, <see cref="ExecutingCount"/> became zero, so status is set to <see cref="LifetimeStatus.Terminating"/>). /// Resources invocation order: LIFO /// All errors are logged by <see cref="ILog"/> so termination of each resource is isolated. /// /// Method throws <see cref="InvalidOperationException"/> if <see cref="Status"/> ≥ <see cref="LifetimeStatus.Terminating"/>. /// The reason is that lifetime is in inconsistent partly terminated state. /// </summary> /// <param name="terminationHandler">termination resources whose <see cref="ITerminationHandler.OnTermination"/> method is invoked on termination</param> /// <returns>this lifetime</returns> [PublicAPI] public Lifetime OnTermination([NotNull] ITerminationHandler terminationHandler) { Definition.OnTermination(terminationHandler); return(this); }