第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

更改服務(wù)是在運(yùn)行時(shí)通過 .Net Core DI 容器注入為作用域還是瞬態(tài)?

更改服務(wù)是在運(yùn)行時(shí)通過 .Net Core DI 容器注入為作用域還是瞬態(tài)?

C#
神不在的星期二 2023-08-13 13:56:45
我們的應(yīng)用程序中有幾個(gè)依賴于 Entity Framework 6 的類。因此,我們將我們的資金注入DbContext到各個(gè)領(lǐng)域。但是,某些模塊實(shí)現(xiàn)了多線程方法,需要DbContext將其作為瞬態(tài)服務(wù)注入以防止任何線程問題。其他模塊能夠通過簡(jiǎn)單地調(diào)用接收SaveChanges相同共享的任何子模塊或模塊來串在一起并批量保存DbContext。但是,這種方法需要DbContext添加為范圍服務(wù)。除了構(gòu)建一些簡(jiǎn)單地繼承自 my 的子類或接口之外DbContext,是否有任何方法可以動(dòng)態(tài)確定類是否獲取給定服務(wù)的作用域版本或瞬態(tài)版本?子類化上下文的示例可能類似于public class TransientDbContext : DbContext {}public class ScopedDbContext : DbContext {}// in servicesservices.AddTransient<TransientDbContext>();services.AddScoped<ScopedDbContext>();這是可行的,但我正在尋找一些更動(dòng)態(tài)的東西,我可以在其中傳遞一個(gè)參數(shù)來指示一個(gè)類應(yīng)該使用共享上下文。對(duì)于一些額外的上下文,圖像我有以下接口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)}在幕后,我可能有以下具體實(shí)現(xiàn)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);    }}現(xiàn)在,在某些情況下,我希望向底層存儲(chǔ)庫注入單一范圍的上下文,而其他時(shí)候我想要一個(gè)瞬態(tài)上下文。這些瞬態(tài)上下文在使用時(shí)顯然會(huì)提交自己的更改。但作用域上下文會(huì)將其更改作為單個(gè)單元提交。
查看完整描述

1 回答

?
拉風(fēng)的咖菲貓

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊

我認(rèn)為你的問題的核心在于以下觀察:

某些模塊實(shí)現(xiàn)多線程方法,需要將 DbContext 作為瞬態(tài)服務(wù)注入,以防止任何線程問題。

這意味著您的應(yīng)用程序代碼本身負(fù)責(zé)處理多線程;您可能正在啟動(dòng)新的線程或任務(wù)。這是你應(yīng)該防止的事情。

相反,只有您的Composition Root應(yīng)該了解多線程性并且應(yīng)該派生出新線程。這集中了有關(guān)線程安全的知識(shí)。但不僅如此,許多組件都不是線程安全的,只有組合根應(yīng)該知道哪些組件是線程安全的,哪些不是。組件本身應(yīng)該始終以順序方式調(diào)用其依賴項(xiàng),并假設(shè)該依賴項(xiàng)只有一個(gè)實(shí)例。

這意味著當(dāng)您開始并行操作時(shí),您應(yīng)該返回到組合根以讓它解析新的對(duì)象圖。然后,組合根可以決定將組件的新實(shí)例注入到圖中(例如您的DbContext)。

DbContext當(dāng)您應(yīng)用這種工作方式時(shí),您將不再需要有瞬態(tài)版本和作用域版本。

查看完整回答
反對(duì) 回復(fù) 2023-08-13
  • 1 回答
  • 0 關(guān)注
  • 158 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)