AbpVnext 本地事件匯流排 補充知識 發佈訂閱 概念 應用場景 本地事件匯流排允許服務發佈和訂閱進程內事件,這意味著如果兩個服務>(發佈者和訂閱者)在同一個進程中運行,那麼它是合適的 完整示例 DDD開發規範: 先定義好介面層、後實現層、暴露介面 對於要更新的實體 //領域層的實體 public ...
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);
}
}
}
總結