繁体   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