public void Unregister(IObjectRegistration registration) { Requires.NotNull(registration, "registration"); var relation = registration.ObjectBuilder.ObjectRelation; var rootReg = new RootRegistration() { ObjectRegistration = registration, OriginalState = relation.RegistrationState }; // Change the registration state, this is to make sure that the ObjectBuilderUnregistering event is only triggered once _stateLock.Enter(); try { switch (relation.RegistrationState) { case RegistrationState.Unregistering: case RegistrationState.Unregistered: return; default: //case RegistrationState.Deactivating: //case RegistrationState.Deactivated: //case RegistrationState.Registered: //case RegistrationState.Activating: //case RegistrationState.Activated: relation.RegistrationState = RegistrationState.Unregistering; break; } } finally { _stateLock.Exit(); } NotifyObjectBuilderUnregistering(new ObjectUnregisteringEventArgs(registration.ObjectDescription)); var operations = new List <IOperation>(); var parents = new List <ObjectBuilder>(); _operationLock.EnterWriteLock(); try { RemoveRootRegistration(rootReg, ref operations); DeactivateParentRegistrations(registration, parents.Count, ref parents, ref operations); } finally { _operationLock.ExitWriteLock(); } // Must not trigger any events within the scope of a lock to allow the event listeners to operate // (add/remove/get...) the service registry in the event handler. Otherwise, these operations might // cause a dead lock problem. PerformDeactivationOperations(operations); }
void RemoveRootRegistration(RootRegistration rootReg, ref List <IOperation> operations) { var registration = rootReg.ObjectRegistration; var builder = registration.ObjectBuilder; var relation = builder.ObjectRelation; var group = relation.ObjectBuilderGroup; switch (rootReg.OriginalState) { case RegistrationState.Unregistering: case RegistrationState.Unregistered: throw new ImpossibleException(); case RegistrationState.Deactivating: case RegistrationState.Deactivated: if (!group.Remove(registration)) { relation.RegistrationState = RegistrationState.Unregistered; throw new InvalidOperationException(); } RemoveFromListenerList(builder); if (group.Count == 0 && !group.IsObserved) { var key = GetKey(builder.ObjectDescription.ContractType); _key2Groups.Remove(key); } operations.Add(new PartialUnregistrationOperation(relation)); break; default: //case RegistrationState.Registered: //case RegistrationState.Activating: //case RegistrationState.Activated: if (!group.Remove(registration)) { relation.RegistrationState = RegistrationState.Unregistered; throw new InvalidOperationException(); } //RemoveFromListenerList(builder); if (group.Count == 0 && !group.IsObserved) { var key = GetKey(builder.ObjectDescription.ContractType); _key2Groups.Remove(key); } operations.Add(new UnregistrationOperation(relation)); break; } }
public void Unregister(IEnumerable <IObjectRegistration> registrations) { Requires.NotNull(registrations, "registrations"); var qualifiedItems = new List <RootRegistration>(); // Change the registration states, make sure the ObjectBuilderUnregistering is only triggered once for each registration _stateLock.Enter(); try { foreach (var registration in registrations) { if (registration == null) { throw new ArgumentException(""); } var relation = registration.ObjectBuilder.ObjectRelation; switch (relation.RegistrationState) { case RegistrationState.Unregistering: case RegistrationState.Unregistered: continue; default: var rootReg = new RootRegistration { ObjectRegistration = registration, OriginalState = relation.RegistrationState }; qualifiedItems.Add(rootReg); relation.RegistrationState = RegistrationState.Unregistering; break; } } } finally { _stateLock.Exit(); } if (qualifiedItems.Count == 0) { return; } foreach (var qualifiedItem in qualifiedItems) { NotifyObjectBuilderUnregistering(new ObjectUnregisteringEventArgs(qualifiedItem.ObjectRegistration.ObjectDescription)); } var parents = new List <ObjectBuilder>(); var operations = new List <IOperation>(); _operationLock.EnterWriteLock(); try { for (int i = 0; i < qualifiedItems.Count; i++) { var qualifiedItem = qualifiedItems[i]; RemoveRootRegistration(qualifiedItem, ref operations); DeactivateParentRegistrations(qualifiedItem.ObjectRegistration, parents.Count, ref parents, ref operations); } } finally { _operationLock.ExitWriteLock(); } PerformDeactivationOperations(operations); }