<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      本地事件總線和事務

      本地事件總線和事務

      通過重寫Ef CoreSaveChanges/SaveChangesAsync來實現(xiàn)事務。當然,如果您愿意實現(xiàn)倉儲層,可以在倉儲層實現(xiàn)展開對應實體包含的事件,并且調(diào)整事件的處理順序。

      Github倉庫地址:soda-event-bus

      實現(xiàn)AggregateRoot

      AggregateRoot類主要通過一個集合來記錄本次事務的所有事件,到保存前再展開讀取,在Abp中采用的ICollection記錄的本地事件,通過實現(xiàn)一個排序器來保證順序問題,我這里直接采用了ConcurrentQueue,保證原子操作的同時保證了順序性,實現(xiàn)更簡單一些。

      public abstract class AggregateRoot
      {
          public ConcurrentQueue<object> LocalEvents { get; } = new();
      
          public void AddLocalEvent<TEvent>(TEvent eventData) where TEvent : IEvent
          {
              LocalEvents.Enqueue(eventData);
          }
      
          public bool GetLocalEvent(out object? @event)
          {
              LocalEvents.TryDequeue(out var eventData);
      
              @event = eventData;
              return @event is not null;
          }
      
          public void ClearLocalEvents()
          {
              LocalEvents.Clear();
          }
      }
      

      重寫DbContext

      主要是從ServiceProvider中獲取對應實體類包含的事件,并且找到對應的Handler進行處理,然后再當作一個事務提交。

      public class EventBusDbContext<TDbContext> : DbContext
          where TDbContext : DbContext
      {
          private readonly IServiceProvider _serviceProvider;
      
          public EventBusDbContext(DbContextOptions<TDbContext> options, IServiceProvider serviceProvider) : base(options)
          {
              _serviceProvider = serviceProvider;
          }
      
          public override int SaveChanges()
          {
              return base.SaveChanges();
          }
      
          public override int SaveChanges(bool acceptAllChangesOnSuccess)
          {
              return base.SaveChanges(acceptAllChangesOnSuccess);
          }
      
          public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
          {
              await HandleEventsAsync();
      
              return await base.SaveChangesAsync(cancellationToken);
          }
      
          public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
          {
              await HandleEventsAsync();
      
              return await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
          }
      
          private async Task HandleEventsAsync()
          {
              foreach (var entityEntry in ChangeTracker.Entries<AggregateRoot>())
              {
                  while (entityEntry.Entity.GetLocalEvent(out var @event))
                  {
                      if (@event is null) break;
      
                      await HandleEventAsync(@event);
                  }
      
                  entityEntry.Entity.ClearLocalEvents();
              }
          }
      
          private async Task HandleEventAsync(object @event)
          {
              var eventHandlerType = typeof(IAsyncEventHandler<>).MakeGenericType(@event.GetType());
              var eventHandler = _serviceProvider.GetRequiredService(eventHandlerType);
      
              var method = eventHandler.GetType().GetMethod(nameof(IAsyncEventHandler<IEvent>.HandleAsync));
              var exceptionHandleMethod = eventHandlerType.GetMethod(nameof(IAsyncEventHandler<IEvent>.HandleException));
      
              try
              {
                  await (Task)method!.Invoke(eventHandler, new[] { @event })!;
              }
              catch (Exception ex)
              {
                  exceptionHandleMethod!.Invoke(eventHandler, new[] { @event, ex });
              }
          }
      }
      

      分布式事件總線和事務

      根據(jù)需要擴展即可,基本邏輯相同,但可能需要增加確認機制等。

      posted @ 2024-01-02 09:50  胖紙不爭  閱讀(330)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美成人午夜在线观看视频| 国产乱码1卡二卡3卡四卡5| 欧美中文亚洲v在线| 亚洲人黑人一区二区三区| 永久国产盗摄一区二区色欲| 成人拍拍拍无遮挡免费视频| 日日麻批免费40分钟无码| 国内极度色诱视频网站| 久久本道综合久久伊人| 亚洲久久色成人一二三区| 蜜臀视频在线观看一区二区| 狠狠躁夜夜躁人人爽天天bl| 91久久偷偷做嫩草影院免费看| 久久国产精品不只是精品| 国产一区二区视频啪啪视频| 亚洲国产在一区二区三区| 欧美人与动牲猛交A欧美精品| 国产初高中生视频在线观看| 亚洲一区二区精品动漫| 国产一区二区三区精品综合| 久久久国产精品樱花网站| 欧美大bbbb流白水| 亚洲精品三区四区成人少| 亚洲人成电影在线天堂色| 夜爽8888视频在线观看| 国产精品线在线精品国语| 激情在线网| 国产精品无码久久久久AV| 亚洲偷自拍另类一区二区| 久久av无码精品人妻出轨| 精品一区精品二区制服| 狠狠综合久久综合88亚洲| 精品成在人线av无码免费看| 玩两个丰满老熟女久久网 | 无码熟妇人妻AV在线影片最多| 浮山县| 亚洲永久精品日韩成人av| 精品国产品香蕉在线| 亚洲人成电影网站色mp4| 国产亚洲精品久久77777| 国产成人午夜在线视频极速观看|