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