领域事件预备测试
parent
45c74694f2
commit
b5e756ffa3
|
@ -151,9 +151,20 @@ builder.Services.AddMediator(cfg =>
|
||||||
cfg.AddConsumer<ConsistencyCheckConsumer>();
|
cfg.AddConsumer<ConsistencyCheckConsumer>();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 添加 MassTransit 和 InMemory 传输
|
||||||
builder.Services.AddMassTransit(cfg =>
|
builder.Services.AddMassTransit(cfg =>
|
||||||
{
|
{
|
||||||
cfg.UsingInMemory();
|
// 注册消费者
|
||||||
|
cfg.AddConsumer<AddSubjectConsumer>(); // 替换为你的消费者类
|
||||||
|
|
||||||
|
// 使用 InMemory 作为消息传递机制
|
||||||
|
cfg.UsingInMemory((context, cfg) =>
|
||||||
|
{
|
||||||
|
// 这里可以进行额外的配置
|
||||||
|
cfg.ConfigureEndpoints(context); // 自动配置所有消费者的端点
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
|
||||||
|
using AutoMapper;
|
||||||
|
using IRaCIS.Core.Domain;
|
||||||
|
using MassTransit;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
|
|
||||||
|
public class AddSubjectConsumer(IRepository<SubjectVisit> _subjectVisitRepository,
|
||||||
|
|
||||||
|
IRepository<VisitStage> _visitStageRepository,
|
||||||
|
IRepository<Trial> _trialRepository,
|
||||||
|
IMapper _mapper) : IConsumer<AddSubjectEvent>
|
||||||
|
{
|
||||||
|
public async Task Consume(ConsumeContext<AddSubjectEvent> context)
|
||||||
|
{
|
||||||
|
var addSubjectEvent= context.Message;
|
||||||
|
|
||||||
|
//添加受试者的时候,获取访视计划列表,添加到受试者访视表。
|
||||||
|
var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == addSubjectEvent.TrialId && t.IsConfirmed).ToListAsync();
|
||||||
|
|
||||||
|
var svList = _mapper.Map<List<SubjectVisit>>(visitPlanList);
|
||||||
|
|
||||||
|
var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == addSubjectEvent.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
svList.ForEach(t =>
|
||||||
|
{
|
||||||
|
t.SubjectId = addSubjectEvent.SubjectId;
|
||||||
|
t.TrialId = addSubjectEvent.TrialId;
|
||||||
|
t.TrialSiteId = addSubjectEvent.TrialSiteId;
|
||||||
|
t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false;
|
||||||
|
t.Id = NewId.NextGuid();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
await _subjectVisitRepository.AddRangeAsync(svList);
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,7 @@ public abstract class Entity : IEntity<Guid>
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
#region 领域事件 仅仅允许通过提供的方法进行操作
|
#region 领域事件 仅仅允许通过提供的方法进行操作
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
private readonly List<DomainEvent> _domainEvents = [];
|
private readonly List<DomainEvent> _domainEvents = [];
|
||||||
|
|
||||||
|
@ -41,6 +42,7 @@ public abstract class Entity : IEntity<Guid>
|
||||||
{
|
{
|
||||||
_domainEvents.Clear();
|
_domainEvents.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
#region 减少实体属性,增加基类
|
#region 减少实体属性,增加基类
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
using IRaCIS.Core.Domain.BaseModel;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Domain;
|
||||||
|
|
||||||
|
public class AddSubjectEvent : DomainEvent
|
||||||
|
{
|
||||||
|
public Guid SubjectId { get; set; }
|
||||||
|
public Guid TrialId { get; set; }
|
||||||
|
|
||||||
|
public Guid TrialSiteId { get; set; }
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
|
||||||
|
using IRaCIS.Core.Domain;
|
||||||
|
using IRaCIS.Core.Domain.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Infra.EFCore;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static class DBContext_Ext
|
||||||
|
{
|
||||||
|
public static void AddDomainEvents(this DbContext context)
|
||||||
|
{
|
||||||
|
var changeTracker = context.ChangeTracker;
|
||||||
|
|
||||||
|
// 遍历 ChangeTracker 中的实体
|
||||||
|
foreach (var entry in changeTracker.Entries<Subject>())
|
||||||
|
{
|
||||||
|
var subject = entry.Entity;
|
||||||
|
|
||||||
|
if (entry.State == EntityState.Added)
|
||||||
|
{
|
||||||
|
// 受试者添加 触发访视自动添加
|
||||||
|
var addedEvent = new AddSubjectEvent { SubjectId = subject.Id, TrialId = subject.TrialId, TrialSiteId = subject.TrialSiteId };
|
||||||
|
|
||||||
|
subject.AddDomainEvent(addedEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,6 +22,9 @@ public class AuditEntityInterceptor(IUserInfo _userInfo, ILogger<AuditEntityInte
|
||||||
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData,
|
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData,
|
||||||
InterceptionResult<int> result, CancellationToken cancellationToken = default)
|
InterceptionResult<int> result, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
//测试领域事件
|
||||||
|
eventData.Context.AddDomainEvents();
|
||||||
|
|
||||||
//审计时间
|
//审计时间
|
||||||
AuditEntities(eventData.Context);
|
AuditEntities(eventData.Context);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue