AbpVnext 本地事件总线
补充知识
发布订阅
概念
应用场景
本地事件总线允许服务发布和订阅进程内事件,这意味着如果两个服务>(发布者和订阅者)在同一个进程中运行,那么它是合适的
完整示例
DDD开发规范: 先定义好接口层、后实现层、暴露接口
对于要更新的实体
- //领域层的实体
- public class Book : FullAuditedEntity<Guid>, IHasExtraProperties, IMultiTenant
- {
- public string Name{get;set;}
- public string Author {get;set;}
- public long Price {get;set}
-
- public string Title {get;set;}
- public string Classify{get;set;}
- //条形码
- public string BarCode {get;set;}
- // 出版商
- public string Issue{get;set;}
- // 页数
- public string PageTotal{get;set;}
-
- public string BuyerId{get;set;}
- public DateTime? ModifyTime{get;set}
- }
复制代码- //这个实体是必须有的
- public class BookRecordEto{
- public string Name{get;set;}
- public string Author {get;set;}
- public long Price {get;set}
- public DateTime? ModifyTime{get;set}
- }
复制代码- //发布事件
- public class BookService: ITransientDependency
- {
- //Abp使用了字典来保存对实例的引用
- public IAbpLazyServiceProvider LazyServiceProvider { get; set; }
- //按需注入
- protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService<ILocalEventBus >();
- //仓储--对应Book的数据库表
- protected IBookRepository BookRepository => LazyGetRequiredService<IBookRepository>();
- public async Task UpdateData(Guid id)
- {
- var book = await BookRepository.FindAsync(x=>x.Id = id);
- if (book == null){//不存在实体}
- var updateEntity = await BookRepository.UpdateAsync(book);
- if (updateEntity == null){//更新失败}
-
- //实体数据发生变更,发布事件
- await LocalEventBus.PublishAsync(new BookEto(){
- Name = book.Name;
- Author = book.Author;
- Price = book.Price;
- ModifyTime = DateTime.Now;
- });
- }
- }
复制代码- //订阅事件
- using Volo.Abp.DependencyInjection;
- using Volo.Abp.EventBus;
- public class EventBusHandler: ApplicationService,
- , ILocalEventHandler<BookRecordEto>
- , ITransientDependency
- {
- // 进行业务数据更新,比如要更新购买这边书读者记录
- public IAbpLazyServiceProvider LazyServiceProvider{get;set;}
-
- protected IBookBoughtRecordRepository BoughtRecordRepository => LazyServiceProvider.LazyGetRequiredService<IBookBoughtRecordRepository>();
- [UnitOfWork]//这个特性以及方法头里面的virtual很重要
- public async virtual Task HandleEventAsync(BookRecordEto eventData)
- {
- //获取购买记录
- var record = await BoughtRecordRepository.GetQueryableAsync();
- var recordList = await AsyncExecuter.ToListAsync(record);
-
- if(recordList.Count() != 0){
- var boughtRecord = ObjectMapper.Map(eventData, new BoughtRecord());
- //插入一条数据
- await BoughtRecordRepository.InsertAsync(boughtRecord);
- }
- }
- }
复制代码总结
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |