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

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

.NET Core 2.1 DbContext ObjectDisposedException

.NET Core 2.1 DbContext ObjectDisposedException

C#
哆啦的時(shí)光機(jī) 2022-11-21 21:22:29
我正在使用 .NET Core 2.1 和 Entity Framework 制作一個(gè) n 層 MVC 應(yīng)用程序。還有一個(gè)托管的 MQTT 隊(duì)列,我的應(yīng)用程序在該隊(duì)列上作為客戶端進(jìn)行偵聽。我還使用依賴注入。這非常有效,直到一條消息被推送到隊(duì)列并且我想將該消息保存到數(shù)據(jù)庫。一旦發(fā)生這種情況,我會(huì)收到以下ObjectDisposedException錯(cuò)誤消息:無法訪問已處置的對象。此錯(cuò)誤的一個(gè)常見原因是處理從依賴項(xiàng)注入解析的上下文,然后嘗試在應(yīng)用程序的其他地方使用相同的上下文實(shí)例。如果您在上下文中調(diào)用 Dispose() 或?qū)⑸舷挛陌b在 using 語句中,則可能會(huì)發(fā)生這種情況。如果您正在使用依賴注入,則應(yīng)該讓依賴注入容器負(fù)責(zé)處理上下文實(shí)例。對象名稱:'xxxDbContext'。我可以單擊繼續(xù),之后應(yīng)用程序繼續(xù)工作。他只在從隊(duì)列收到的第一條消息上拋出異常??刂破?管理器/存儲(chǔ)庫的所有其他操作都可以正常工作。我的代碼如下:啟動(dòng).cspublic void ConfigureServices(IServiceCollection services){    services.AddDefaultIdentity<User>()            .AddEntityFrameworkStores<xxxDbContext>();    services.AddDbContext<xxxDbContext>(options =>        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")    ));    // Some identity configuration omitted here    services.AddScoped<IIdeationRepository, IdeationRepository>();    services.AddScoped<IIdeationManager, IdeationManager>();    // Some other DI configuration omitted as well.}public Configure(IApplicationBuilder app, IHostingEnvironment env,    IApplicationLifetime applicationLifetime, IServiceProvider serviceProvider){    // Start MQTT    var broker = new MqttBroker(serviceProvider.GetService<IIdeationManager>(),        serviceProvider.GetService<IConfiguration>());    // On application exit terminate MQTT to make sure the connection is ended properly    applicationLifetime.ApplicationStopping.Register(() => broker.Terminate());    // Some default http pipeline code omitted}MqttBroker.cspublic MqttBroker(    [FromServices] IIdeationManager ideationManage,    [FromServices] IConfiguration configuration){    _ideationManager = ideationManager;    _configuration = configuration;    Initialize();}    // Some code where I just parse the message and on receive send it to the    // ideation manager, this just works so I omitted it.}管理器只是將它直接發(fā)送到出現(xiàn)錯(cuò)誤消息的存儲(chǔ)庫。
查看完整描述

2 回答

?
慕容3067478

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

IServiceProvider傳入的實(shí)例Configure是scoped,這意味著它在完成后由框架處理-它創(chuàng)建的Configure任何范圍內(nèi)的服務(wù)也會(huì)在此過程中處理。


在您的示例中,您正在請求一個(gè)實(shí)例IIdeationManager(它是scoped),然后嘗試在您的MqttBroker類中使用它(實(shí)際上是一個(gè)singleton)。當(dāng)您嘗試使用 的實(shí)現(xiàn)時(shí)IIdeationManager,由 DI 創(chuàng)建和連接的范圍實(shí)例已被釋放,因此拋出異常。CityOfIdeasDbContextObjectDisposedException


為了解決這個(gè)問題,您可以采用在單例需要訪問范圍服務(wù)時(shí)使用的通用模式:創(chuàng)建范圍、解析服務(wù)、使用服務(wù),然后處置范圍。松散地,這看起來有點(diǎn)像這樣:


using (var scope = serviceProvider.CreateScope())

{

    var ideationManager = scope.ServiceProvider.GetService<IIdeationManager>();


    // Do something with ideationManager.

}


// scope and all created disposable services have been disposed.

當(dāng)您請求實(shí)現(xiàn) 時(shí)IIdeationManager,DI 系統(tǒng)發(fā)現(xiàn)(最終)它需要一個(gè)作用域CityOfIdeasDbContext并為您創(chuàng)建一個(gè)。一旦scope被處置,這個(gè)CityOfIdeasDbContext實(shí)例也被處置。


為了使其在您的示例中起作用,您MqttBroker可以將 的 實(shí)例IServiceProvider帶入其構(gòu)造函數(shù)并使用它來創(chuàng)建我上面顯示的范圍(它仍然可以IConfiguration按原樣使用,因?yàn)樗旧硎且粋€(gè)單例)。


應(yīng)該傳遞給類的實(shí)例不IServiceProvider應(yīng)該是傳遞給類的MqttBroker實(shí)例——這已經(jīng)確定了范圍,并且正如我所描述的那樣,將在完成后清理,這確實(shí)是您開始時(shí)遇到的問題。為此,請使用,它是根提供者并且沒有作用域。IServiceProviderConfigureConfigureapp.ApplicationServices


查看完整回答
反對 回復(fù) 2022-11-21
?
慕村225694

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

我之前也遇到過同樣的問題,我也曾嘗試像 .net 經(jīng)典分層結(jié)構(gòu)存儲(chǔ)庫設(shè)計(jì)模式案例一樣處理 dbcontext 對象,但在 .net 核心中足以使其范圍解決問題。因?yàn)樗槍γ總€(gè)請求進(jìn)行處理,所以您不需要手動(dòng)處理 dbcontext。此外,IServiceCollection 中的 adddbcontext 方法將其實(shí)現(xiàn)為默認(rèn)范圍。參考


查看完整回答
反對 回復(fù) 2022-11-21
  • 2 回答
  • 0 關(guān)注
  • 191 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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