我正在尝试使用DDD和微服务方法创建一个项目,并且我对将域事件发送到另一个服务有一个小问题。我使用EF Core进行数据库通信,并使用MassTransit发送事件。
现在,我的DBConetxt中有一个重写的SaveChangesAsync方法,在该方法中,我通过使用MassTransit在Startup.cs中创建的总线发送了域事件。
DBContext:
private readonly IBus _bus;
public StudentsDbContext(DbContextOptions options, IBus bus) : base(options)
{
_bus = bus;
}
...
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
{
var aggregates = ChangeTracker.Entries<IAggregateRoot>().ToList();
foreach (var aggregate in aggregates)
{
foreach (var domainEvent in aggregate.Entity.DomainEvents)
{
await _bus.Publish(domainEvent, domainEvent.GetType(), cancellationToken);
}
aggregate.Entity.ClearEvents();
}
return await base.SaveChangesAsync(cancellationToken);
}
如您所见,我需要将IBus
注入DbContext构造函数中,因此遇到了一些麻烦。例如,由于我的构造函数,我无法使用AddDbContext
方法在Startup.cs文件中注册DbContext,所以我需要这样做:
services.AddSingleton<IBus>(bus);
services.AddTransient<StudentsDbContext>(provider =>
{
var options = new DbContextOptionsBuilder()
.UseSqlServer(Configuration.GetConnectionString("Default"))
.Options;
return new StudentsDbContext(options, provider.GetService<IBus>());
});
因此,我在迁移时遇到了问题。
Unable to create an object of type 'StudentsDbContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
我也想像AddDbContextPool
那样使用池化DbContext。
所以我有2个问题:
答案 0 :(得分:0)
您做错了方法。我认为您必须将代码更正为:
public StudentsDbContext(DbContextOptions<OrderingContext> options, IBus bus) : base(options)
{
_bus = bus ?? throw new ArgumentNullException(nameof(bus));
}
并在您的创业公司中:
services.AddDbContext<StudentsDbContext>(options =>
{
options.UseSqlServer(Configuration["ConnectionString"]);
});