我正在使用ASP.net核心。我在将dbcontext实现为单例时遇到问题。
我需要在项目启动后立即运行我的单件IModuleRepository。所以我在public void ConfigureServices(IServiceCollection services)
文件的Startup.cs
中创建了这个依赖项的新实例。
这个单身人士正在使用另一个单身人士,所以我这样使用它:
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中使用,因为此时仍在配置它。
如何在项目启动后需要运行此单例时避免此错误?
感谢您的帮助。
答案 0 :(得分:2)
正如@Ilya Chumakov评论的那样,你可以告诉DI容器使用你的具体类:
services.AddSingleton<ICommunicationRepository, CommunicationRepository>();
然后任何类都可以依赖ICommunicationRepository
并获取具体的存储库,它获取Db上下文。
答案 1 :(得分:-1)
我发现了这个问题。这种依赖关系的调用是正确的。错误是在CommunicationRepository中我创建了2个任务,并且它们都使用相同的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();
感谢您的回答。