我们的应用程序中有几个类依赖于Entity Framework 6。因此,我们将我们的
DbContext
注入到各个区域中。然而,某些模块实现了多线程方法,需要将DbContext
作为瞬态服务注入以防止任何线程问题。其他模块可以通过在任何子模块或接收相同共享DbContext
的模块上调用SaveChanges
来一起被串联并整体保存。然而,这种方法需要将DbContext
添加为作用域服务。
除了构建一个仅仅从我的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);
}
}
现在在某些情况下,我希望注入底层存储库具有单一范围的上下文,并且在其他情况下,我希望使用瞬态上下文。当使用时,这些瞬态上下文显然会提交它们自己的更改。但是,作用域上下文将作为一个单一单位提交它们的更改。