C#MongoClient.StartSession()和IClientSessionHandle依赖项注入
当我想为两个不同的集合使用事务时,我正在处理一些有关MongoDb会话的问题。我已经实现了DDD体系结构设计和MediatR用于处理CRQ模式,解决方案是为MongoDB上的每个集合使用一个repository类。我知道,每次调用/获取集合时,我都需要传递session对象,以便获得要在该事务上插入/更新的其他集合的相同范围。会话是在MongoContext类中创建的,该类包含主客户端连接和其他方法C#MongoClient.StartSession()和IClientSessionHandle依赖项注入,c#,transactions,autofac,mongodb-.net-driver,C#,Transactions,Autofac,Mongodb .net Driver,当我想为两个不同的集合使用事务时,我正在处理一些有关MongoDb会话的问题。我已经实现了DDD体系结构设计和MediatR用于处理CRQ模式,解决方案是为MongoDB上的每个集合使用一个repository类。我知道,每次调用/获取集合时,我都需要传递session对象,以便获得要在该事务上插入/更新的其他集合的相同范围。会话是在MongoContext类中创建的,该类包含主客户端连接和其他方法 public virtual void InsertUpdate(TEntity obj){
public virtual void InsertUpdate(TEntity obj){
MongoContext.AddCommand(() => DbSet.InsertOneAsync(_session, obj));
}
MongoContext.AddCommand(()) is ------> List<Func<Task>> _commands;
builder.RegisterType<MongoContext>()
.As<IMongoContext>()
.WithParameter("connectionString", _databaseConnectionString)
.WithParameter("dbName", _dbName)
.InstancePerLifetimeScope();
builder.RegisterType<UnitOfWork>()
.As<IUnitOfWork>()
.InstancePerLifetimeScope();
builder.RegisterType<ProductMongoRepository>()
.As<IProductRepository>()
.InstancePerLifetimeScope();
builder.Register(ctx => ctx.Resolve<IMongoContext>().Session)
.As<IClientSessionHandle>()
.InstancePerLifetimeScope();
//Start Transaction (Get a session by calling MongoClient.StartSession();)
// Get a new session on each call
try {
.........
_facilityRepository.InsertUpdate(facilities);
_facilityCustomRepository.InsertUpdate(facilityCustoms);
Commit();
}
catch(ex){
Abort();
}