【发布时间】:2017-05-02 18:01:12
【问题描述】:
我正在使用 ASP.net 核心。我在将 dbcontext 实现为单例时遇到问题。
我需要我的单例 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 中使用,因为此时它仍在配置中。
项目启动后需要运行这个单例时如何避免这个错误?
感谢您的帮助。
【问题讨论】:
-
不要显式解决依赖关系。请改用
services.AddSingleton<ICommunicationRepository, CommunicationRepository>();。 -
@IlyaChumakov 答案与下面的 juunas 相同。
标签: c# entity-framework asp.net-core asp.net-core-mvc dbcontext