代码改变世界

Abp 聚合测试

2019-07-28 22:35  qgbo  阅读(672)  评论(5编辑  收藏  举报

 

Abp 官网开始的教程例子,是IRpositoty<entity> 直接出现在应用层。但是如果是一个聚合根也会这样吗?  那么聚合根是访问仓储的最小单元,要通过聚合根来操作业务,就是实体,那么实体的增删改查,也应该在聚合根里面。

这就就有一个问题,实体继承了聚合根,,他没有仓储,怎么保存呢?

方法一: 依赖注入,这是不行的,这样数据库迁移不成功。

          
 1  public class Order :AggregateRoot, IRepository<Order>, ICreationAudited
 2     {
 3           [NotMapped]
 4         private IRepository<Order> _repository { get; set; }
 5         public Order(IRepository<Order> repository)
 6         {
 7                 _repository = repository;
 8         }
 9         public long? CreatorUserId { get; set; }
10         public DateTime CreationTime { get; set ; }
11         public List<OrderItem> OrderItem { get; set; }
12         public string Remark { get; set; }
13         public Address Address { get; set; }
14 
15         public Order Insert(Order entity)
16         {
17             return entity;
18         }
19 }

 

 
方法二:继承仓储接口,
public class Order :AggregateRoot, IRepository<Order>, ICreationAudited
    {
          
        public long? CreatorUserId { get; set; }
        public DateTime CreationTime { get; set ; }
        public List<OrderItem> OrderItem { get; set; }
        public string Remark { get; set; }
        public Address Address { get; set; }

        public Order Insert(Order entity)
        {
            return entity;
        }
}

 

   这样的问题,是应用层怎么调用呢?应用层还是要出现仓储。
 方法三:实现聚合根接口,继承仓储类:在代码中是Test2.
 
    public class Test2 :  Test2Repository, IAggregateRoot, ICreationAudited
    {
        public long? CreatorUserId { get; set; }
        public DateTime CreationTime { get; set; }


        public string Remark { get; set; }

        public ICollection<IEventData> DomainEvents => throw new NotImplementedException();

        public int Id { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

        public bool IsTransient()
        {
            throw new NotImplementedException();
        }
    }

 这样编译不过去,因为Test2Repository在EF那一层,而Core 是谁也不依赖的,在最下面,这个也是行不通的。

 

方法四:是这个这个聚合根,再实现一个IOrder 接口,这个接口和仓储接口有重合,在应用层,暴露IOrder 接口就行了。

  IOrder可以在应用层依赖注入进去,因为他的postfix 是Order。
  泛型方法在调用的时候,可以作为类型传递的(参数或返回值)
      这个执行完,不会保存,
上面是3个不可行的,下面有个方法可以
Success方法一:使用属性注入就可以了。注意,要把聚合根放在依赖注入框架中。这个例子是Test
       IocManager.Register<Test>(DependencyLifeStyle.Transient);