zoukankan      html  css  js  c++  java
  • Abp 聚合测试

    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);
     
     
     
    气功波(18037675651)
  • 相关阅读:
    单链表
    队列
    产品经理们,遇到Bug请别十万火急
    2008年7月3日
    JS URL 参数
    NET 产品版权保护方案 (.NET源码加密保护)
    常用正则表达式
    网线接法
    C#创建多文档的界面
    TGE学习笔记04 billboard
  • 原文地址:https://www.cnblogs.com/qgbo/p/11261301.html
Copyright © 2011-2022 走看看