DDD领域设计 返回

SqlSugar 沟通中
14 405

您好,有没有什么方法完成和EFCore类型功能的方法 因为我看AOP好像达不到这样的要求


var domainEntities = ChangeTracker

.Entries<IDomainEvents>()

.Where(x => x.Entity.GetDomainEvents().Any());


var domainEvents = domainEntities

    .SelectMany(x => x.Entity.GetDomainEvents())

    .ToList();//加ToList()是为立即加载,否则会延迟执行,到foreach的时候已经被ClearDomainEvents()了


domainEntities.ToList()

    .ForEach(entity => entity.Entity.ClearDomainEvents());


热忱回答14

  • 描述清楚需求

    0 回复
  • 想将sqlsugar应用于DDD领域驱动模式,并且实体是充血模型,通过领域事件去管理跨聚合的操作,在提交事务的时候统一去处理领域事件,但是我看目前NETCORE 使用DDD模式主流还是EFCore

    0 回复
  • HaQ!u HaQ!u VIP0
    1周前

    image.png

    我是通过审计日志加Db的临时对象功能去处理的,先添加到临时集合中然后在事务提交的时候获取临时集合的事件去批量处理就好了

    0 回复
  • @HaQ!u:您好,这种实现的是数据的强一致性 还是最终一致性呢

    0 回复
  • HaQ!u HaQ!u VIP0
    1周前

    @୧⍤⃝ 🐷
    领域事件我是通过IMediator.Publish的因为在一个上下文中可以做到强一致性的,
    集成事件通过CAP做最终一致

    public class UnitOfWorkCore : SugarUnitOfWork

    {

        public new bool Commit()

        {

            if ((IsTran && !IsCommit) || Db.Ado.IsNoTran())

            {

                // 处理领域事件

                Db.DispatchDomainEvents(ServiceProvider);

                // 处理集成事件

                Db.DispatchIntegrationEvents(ServiceProvider, IsTran);

            }


            return base.Commit();

        }

    }

    0 回复
  • @HaQ!u:您好请教一下 你的实体是如何配置的 我这里拿不到这列微信图片_20241202144558.pngimage.png

    0 回复
  • @HaQ!u:OnDiffLogEvent方法 只要执行Insert方法就会进入 如果说保存多个不同的实体 每个实体都有事件 是不是就会有问题呢?比如这样image.png

    0 回复
  • HaQ!u HaQ!u VIP0
    6天前

    @୧⍤⃝ 🐷:这里的作用就是把每个实体的事件先添加到临时集合中去,然后在提交的时候统一处理,Db是同一个

    0 回复
  • HaQ!u HaQ!u VIP0
    6天前

    @୧⍤⃝ 🐷

    private readonly List<IDomainEvent> _domainEvents = [];


    [JsonIgnore]

    [SugarColumn(IsIgnore = true)]

    public IReadOnlyCollection<IDomainEvent> DomainEvents => _domainEvents.AsReadOnly();


    public void AddDomainEvent(IDomainEvent @event)

    {

        _domainEvents.Add(@event);

    }


    0 回复
  • @HaQ!u:您好 这种方法是不是只对新增有效果 更新和删除没有效果

    0 回复
  • HaQ!u HaQ!u VIP0
    4天前

    @୧⍤⃝ 🐷

    StaticConfig.CompleteInsertableFunc

    StaticConfig.CompleteUpdateableFunc

    StaticConfig.CompleteDeleteableFunc
    这三个类型的事件你都注册了?


    0 回复
  • @HaQ!u:是的 更新和删除拿不到类中的Domian 只有新增可以拿到 所以我改成了用Aop.DataExecuting来完成我的需求 你的可以拿到嘛

    0 回复
  • HaQ!u HaQ!u VIP0
    3天前

    @୧⍤⃝ 🐷
    你是不是自己实现的工作单元
    然后不是单例模式注入的
    那样可能是每次Db对象都是新的
    所以问题不是因为只有新增操作才执行 

    可能是你最后一个操作是新增就只记录到最后一个操作的事件

    0 回复
  • @HaQ!u:我是自己实现的工作单元 注册成Scoped ISqlSugarClient注册是单例的 这是我的demo 

    Sugars.zip


    0 回复