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); }