我们的应用程序中有几个依赖于 Entity Framework 6 的类。因此,我们将我们的资金注入DbContext到各个领域。但是,某些模块实现了多线程方法,需要DbContext将其作为瞬态服务注入以防止任何线程问题。其他模块能够通过简单地调用接收SaveChanges相同共享的任何子模块或模块来串在一起并批量保存DbContext。但是,这种方法需要DbContext添加为范围服务。
除了构建一些简单地继承自 my 的子类或接口之外DbContext,是否有任何方法可以动态确定类是否获取给定服务的作用域版本或瞬态版本?
子类化上下文的示例可能类似于
public class TransientDbContext : DbContext {}
public class ScopedDbContext : DbContext {}
// in services
services.AddTransient<TransientDbContext>();
services.AddScoped<ScopedDbContext>();
这是可行的,但我正在寻找一些更动态的东西,我可以在其中传递一个参数来指示一个类应该使用共享上下文。
对于一些额外的上下文,图像我有以下接口
public interface IRepository<TEntity>
{
void Add(TEntity entity);
Task SaveAsync(CancellationToken token = default);
}
public interface IUserManager
{
Task AddAsync(User user, bool commitChanges = true, CancellationToken = default);
}
public interface IUserPhoneNumberManager
{
Task AddAsync(UserPhoneNumber number, bool commitChanges, CancellationToken token = default)
}
在幕后,我可能有以下具体实现
public class UserRepository<User> : IRepository<User>
{
private readonly DbContext _dbContext;
public UserRepository(DbContext dbContext)
{
_dbContext = dbContext;
}
public void Add(User entity)
{
_dbContext.Users.Add(entity);
}
public Task SaveAsync(CancellationToken token = default)
{
return _dbContext.SaveChangesAsync(token);
}
}
public class UserPhoneNumberRepository<UserPhoneNumber> : IRepository<UserPhoneNumber>
{
private readonly DbContext _dbContext;
public UserRepository(DbContext dbContext)
{
_dbContext = dbContext;
}
public void Add(UserPhoneNumber entity)
{
_dbContext.UserPhoneNumbers.Add(entity);
}
public Task SaveAsync(CancellationToken token = default)
{
return _dbContext.SaveChangesAsync(token);
}
}
现在,在某些情况下,我希望向底层存储库注入单一范围的上下文,而其他时候我想要一个瞬态上下文。这些瞬态上下文在使用时显然会提交自己的更改。但作用域上下文会将其更改作为单个单元提交。
拉风的咖菲猫
相关分类