簡體   English   中英

使用DbContext的Singleton - 在Startup.cs中創建實例

[英]Singleton with DbContext - creating instance in Startup.cs

我正在使用ASP.net核心。 我有將dbcontext實現為singleton的問題。

我需要在項目啟動后立即運行我的單例IModuleRepository。 所以我在Startup.cs文件中的public void ConfigureServices(IServiceCollection services)中創建了這個依賴項的新實例。

這個單身人士正在使用另一個單身人士,所以我這樣使用它:

services.AddDbContext<ModulesDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")).EnableSensitiveDataLogging());
...    
services.AddSingleton<IModuleRepository, ModuleRepository>();
services.AddSingleton<ICommunicationRepository>(new CommunicationRepository(services.BuildServiceProvider().GetService<IModuleRepository>()));

在ModuleRepository中我使用的是DBcontext。

// Db context
    private readonly ModulesDbContext _modulesDbContext;

    public ModuleRepository(ModulesDbContext modulesDbContext)
    {
        _modulesDbContext = modulesDbContext;
    }

當我調用_modulesDbContext.SomeModel.ToList(); 我收到錯誤:

System.InvalidOperationException:嘗試在配置上下文時使用上下文。 DbContext實例不能在OnConfiguring內使用,因為此時仍在配置它。

如何在項目啟動后需要運行此單例時避免此錯誤?

謝謝您的幫助。

正如@Ilya Chumakov評論的那樣,您可以告訴DI容器使用您的具體類,如下所示:

services.AddSingleton<ICommunicationRepository, CommunicationRepository>();

然后任何類都可以依賴於ICommunicationRepository並獲取具體的存儲庫,它獲取Db上下文。

我想出了這個問題。 這種依賴關系的調用是正確的。 錯誤是在CommunicationRepository中我創建了2個Task,它們都使用了相同的DbContext - 所以它多次使用它。 我不得不說task.Wait();

修正后CommunicationRepository的構造函數中的完整代碼:

// Add pernament communication
        var task = new Task(AddPernamentCommunicationAll);
        task.Start();
        task.Wait();

        // Add modules
        var taskModules = new Task(AddModulesToList);
        taskModules.Start();

謝謝您的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM