我們的應用程序中有幾個依賴于 Entity Framework 6 的類。因此,我們將我們的資金注入DbContext到各個領域。但是,某些模塊實現了多線程方法,需要DbContext將其作為瞬態服務注入以防止任何線程問題。其他模塊能夠通過簡單地調用接收SaveChanges相同共享的任何子模塊或模塊來串在一起并批量保存DbContext。但是,這種方法需要DbContext添加為范圍服務。除了構建一些簡單地繼承自 my 的子類或接口之外DbContext,是否有任何方法可以動態確定類是否獲取給定服務的作用域版本或瞬態版本?子類化上下文的示例可能類似于public class TransientDbContext : DbContext {}public class ScopedDbContext : DbContext {}// in servicesservices.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); }}現在,在某些情況下,我希望向底層存儲庫注入單一范圍的上下文,而其他時候我想要一個瞬態上下文。這些瞬態上下文在使用時顯然會提交自己的更改。但作用域上下文會將其更改作為單個單元提交。
1 回答

拉風的咖菲貓
TA貢獻1995條經驗 獲得超2個贊
我認為你的問題的核心在于以下觀察:
某些模塊實現多線程方法,需要將 DbContext 作為瞬態服務注入,以防止任何線程問題。
這意味著您的應用程序代碼本身負責處理多線程;您可能正在啟動新的線程或任務。這是你應該防止的事情。
相反,只有您的Composition Root應該了解多線程性并且應該派生出新線程。這集中了有關線程安全的知識。但不僅如此,許多組件都不是線程安全的,只有組合根應該知道哪些組件是線程安全的,哪些不是。組件本身應該始終以順序方式調用其依賴項,并假設該依賴項只有一個實例。
這意味著當您開始并行操作時,您應該返回到組合根以讓它解析新的對象圖。然后,組合根可以決定將組件的新實例注入到圖中(例如您的DbContext
)。
DbContext
當您應用這種工作方式時,您將不再需要有瞬態版本和作用域版本。
- 1 回答
- 0 關注
- 161 瀏覽
添加回答
舉報
0/150
提交
取消