我尝试为新的ASP.NET Core网站设置DI,并且我有以下代码:
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// Get the configuration from the app settings.
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
// Get app settings to configure things accordingly.
var appSettings = Configuration.GetSection("AppSettings");
var settings = new AppSettings();
appSettings.Bind(settings);
services
.AddOptions()
.Configure<AppSettings>(appSettings)
.AddSingleton<IConfigurationRoot>(config)
.AddDbContext<MyDbContext>(builder =>
{
builder.UseSqlServer(config.GetConnectionString("myConn"));
}, ServiceLifetime.Transient, ServiceLifetime.Transient);
services.AddSingleton<ILoadTestCleanUpServiceRepository, LoadTestCleanUpServiceRepository>();
...
现在,LoadTestCleanUpServiceRepository
取决于MyDbContext
:
public class LoadTestCleanUpServiceRepository : ILoadTestCleanUpServiceRepository
{
private readonly MyDbContext _dbContext;
public LoadTestCleanUpServiceRepository(MyDbContext dbContext)
{
_dbContext = dbContext;
}
...
..并且数据库上下文是这样的:
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> ctxOptions) : base(ctxOptions)
{
}
}
运行应用程序时,出现此错误:
InvalidOperationException:无法解析类型的服务 尝试尝试“ MyCode.Infrastructure.Common.MyDbContext” 启用 “ MyCode.Infrastructure.LoadTestCleanUpService.LoadTestCleanUpServiceRepository”。
我尝试更改ServiceLifetime
选项并添加以下额外代码:
services.AddTransient<MyDbContext>(sp => new MyDbContext(config));
...但是似乎没有任何帮助,我不明白为什么这不起作用。它确实尝试构造存储库,但是为什么它也不能构造DB Context?甚至还没有达到我称之为UseSqlServer()
的地步!
有什么想法吗?
更新1:
嗯...我现在看到了。很有可能是相关的:
更新2:
我现在有:
但是我仍然遇到相同的错误。
答案 0 :(得分:3)
我看到您已将LoadTestCleanUpServiceRepository
注册为Singleton
,而MyDbContext
注册为Transient
,然后您正尝试从MyDbContext
解析LoadTestCleanUpServiceRepository
。那就是问题所在。根据{{3}}文档:
从单例解决有范围的服务/临时服务很危险。处理后续请求时,可能导致服务的状态不正确。
解决方法是:如下注册LoadTestCleanUpServiceRepository
和MyDbContext
:
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringName")));
services.AddScoped<ILoadTestCleanUpServiceRepository, LoadTestCleanUpServiceRepository>();
现在问题应该消失了。