예제 #1
0
        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);
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        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);
        }