Exemplo n.º 1
0
        public void Process(IInvocation invocation, ClassDefineMetadata metadata)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            var entity = invocation.Arguments[0];

            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            var interceptors = RepositoryFramework.GetInterceptors(metadata.EntityType);

            //invoke pre event
            var preUr  = new UniqueRaise(GetRaiseType(invocation, true), metadata, entity, false);
            var postUr = new UniqueRaise(GetRaiseType(invocation, false), metadata, entity, false);

            //invoke cascade delete or update
            var preRaiseType = GetRaiseType(invocation, true);

            if (preRaiseType == RaiseType.PreDelete || preRaiseType == RaiseType.PreUpdate)
            {
                Cascade(invocation, entity);
            }

            RepositoryFramework.Raise(entity, preRaiseType, preUr);

            using (MonitorContext.Repository(invocation.Method))
                invocation.Proceed();

            //invoke post event
            var postRaiseType = GetRaiseType(invocation, false);

            RepositoryFramework.Raise(entity, postRaiseType, postUr);

            //invoke cascade create
            if (postRaiseType == RaiseType.PostCreate)
            {
                Cascade(invocation, entity);
            }

            preUr.Dispose();
            postUr.Dispose();
        }
        internal static object Raise(object entity, RaiseType raiseType, UniqueRaise ur = null)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            var metadata = GetDefineMetadata(entity.GetType());

            if (metadata == null)
            {
                throw new PlatformException("无法获取对象的定义 {0}", entity.GetType().FullName);
            }

            var interceptors = RepositoryFramework.GetInterceptors(metadata.EntityType);

            if (ur == null)
            {
                ur = new UniqueRaise(raiseType, metadata, entity, true);
            }

            if (ur.NotRaised)
            {
                foreach (var interceptor in interceptors)
                {
                    switch (raiseType)
                    {
                    case RaiseType.PreCreate:
                        interceptor.PreCreate(entity);
                        break;

                    case RaiseType.PreUpdate:
                        interceptor.PreUpdate(entity);
                        break;

                    case RaiseType.PreDelete:
                        interceptor.PreDelete(entity);
                        break;

                    case RaiseType.PostCreate:
                        interceptor.PostCreate(entity);
                        break;

                    case RaiseType.PostUpdate:
                        interceptor.PostUpdate(entity);
                        break;

                    case RaiseType.PostDelete:
                        interceptor.PostDelete(entity);
                        break;

                    case RaiseType.PostLoad:
                        interceptor.PostLoad(entity);
                        break;
                    }
                }
            }

            if (ur.NotRaised && ur.AutoDisposed)
            {
                ur.Dispose();
            }

            return(entity);
        }