ABP领域层——实体

参考阳光铭睿的教程:http://www.cnblogs.com/mienreal/p/4528470.html

实体类

ABP中,实体类继承自Entity

 

public class Person : Entity
{
        public virtual string Name { get; set; }
}

 

Person类的父类中有Id属性,Id是该实体的主键,默认类型是int,如果想给Id定义其他类型,如下,也可以设置为string,Guid

 

public class Person : Entity<long>
{
        public virtual string Name { get; set; }
}

 

实体类重写了==操作符,还定义了一个IsTransient()方法来检测实体是否有Id属性

 

Person.Person p1 = new Person.Person { Id = 1, Name = "mm" };
Person.Person p2 = new Person.Person { Id = 1, Name = "jj" };
bool flag = p1 == p2;//true

 

部分源码

public override bool Equals(object obj)
        {
            if (obj == null || !(obj is Entity<TPrimaryKey>))
            {
                return false;
            }

            //Same instances must be considered as equal
            if (ReferenceEquals(this, obj))
            {
                return true;
            }

            //Transient objects are not considered as equal
            var other = (Entity<TPrimaryKey>)obj;
            if (IsTransient() && other.IsTransient())
            {
                return false;
            }

            //Must have a IS-A relation of types or must be same type
            var typeOfThis = GetType();
            var typeOfOther = other.GetType();
            if (!typeOfThis.IsAssignableFrom(typeOfOther) && !typeOfOther.IsAssignableFrom(typeOfThis))
            {
                return false;
            }

            if (this is IMayHaveTenant && other is IMayHaveTenant &&
                this.As<IMayHaveTenant>().TenantId != other.As<IMayHaveTenant>().TenantId)
            {
                return false;
            }

            if (this is IMustHaveTenant && other is IMustHaveTenant &&
                this.As<IMustHaveTenant>().TenantId != other.As<IMustHaveTenant>().TenantId)
            {
                return false;
            }

            return Id.Equals(other.Id);
        }
View Code

 

接口约定

 

实体类实现IHasCreationTime接口就可以具有CreationTime属性,插入数据库时自动设置为当前时。

 

ICreationAudited 扩展自 IHasCreationTime 并且该接口具有属性CreatorUserId,当保存一个新的实体时,

ABP会自动设 CreatorUserId的属性值为当前用户的Id。可以直接派生自实体类CreationAuditedEntity。

 

更新实现接口IModificationAudited 。实现添加和更新属性,扩展IAudited接口,或直接派生自AuditedEntity 。       

   

软删除实现该接口ISoftDelete ,记录谁删了这个实体,实现接口IDeletionAudited 。

扩展所有审计接口,实现IFullAudited ,或直接派生自FullAuditedEntity

 

public class Person : Entity, IFullAudited
 {
        public DateTime CreationTime { get; set; }
        public long? CreatorUserId { get; set; }
        public DateTime? DeletionTime { get; set; }
        public long? DeleterUserId { get; set; }
        public bool IsDeleted { get; set; }
        public DateTime? LastModificationTime { get; set; }
        public long? LastModifierUserId{ get; set; }
  }

部分源码

public override int SaveChanges()
        {
            try
            {
                ApplyAbpConcepts();
                return base.SaveChanges();
            }
            catch (DbEntityValidationException ex)
            {
                LogDbEntityValidationException(ex);
                throw;
            }
        }

 protected virtual void ApplyAbpConcepts()
        {
            var userId = GetAuditUserId();
            var entries = ChangeTracker.Entries().ToList();
            foreach (var entry in entries)
            {
                switch (entry.State)
                {
                    case EntityState.Added:
                        CheckAndSetId(entry.Entity);
                        CheckAndSetMustHaveTenantIdProperty(entry.Entity);
                        CheckAndSetMayHaveTenantIdProperty(entry.Entity);
                        SetCreationAuditProperties(entry.Entity, userId);
                        EntityChangeEventHelper.TriggerEntityCreatingEvent(entry.Entity);
                        EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entry.Entity);
                        break;
                    case EntityState.Modified:
                        SetModificationAuditProperties(entry, userId);
                        if (entry.Entity is ISoftDelete && entry.Entity.As<ISoftDelete>().IsDeleted)
                        {
                            SetDeletionAuditProperties(entry.Entity, userId);
                            EntityChangeEventHelper.TriggerEntityDeletingEvent(entry.Entity);
                            EntityChangeEventHelper.TriggerEntityDeletedEventOnUowCompleted(entry.Entity);
                        }
                        else
                        {
                            EntityChangeEventHelper.TriggerEntityUpdatingEvent(entry.Entity);
                            EntityChangeEventHelper.TriggerEntityUpdatedEventOnUowCompleted(entry.Entity);
                        }

                        break;
                    case EntityState.Deleted:
                        CancelDeletionForSoftDelete(entry);
                        SetDeletionAuditProperties(entry.Entity, userId);
                        EntityChangeEventHelper.TriggerEntityDeletingEvent(entry.Entity);
                        EntityChangeEventHelper.TriggerEntityDeletedEventOnUowCompleted(entry.Entity);
                        break;
                }

                TriggerDomainEvents(entry.Entity);
            }
        }
View Code

 

 

 

 

 

posted @ 2017-04-14 16:34  木美琉璃  阅读(578)  评论(0)    收藏  举报