2 回答

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
- 2 回答
- 0 關(guān)注
- 191 瀏覽
添加回答
舉報(bào)