代码改变世界

Abp 聚合测试

  qgbo  阅读(675)  评论(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);
 
 
 
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示