是否可以在自己创建的服务中访问数据库上下文?在下面的代码中,我想用exampleClassService的构造函数设置数据库上下文。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//Add MVC
services.AddMvc();
//Postgres connection
var connectionString = Configuration["ConnectionStrings:PostgresConnection"];
services.AddDbContext<ApplicationDbContext>(
opts => opts.UseNpgsql(connectionString)
);
//Own created service
services.AddSingleton<ExampleClassService>(
provider => new ExampleClassService(dbcontext?);
...
}
答案 0 :(得分:3)
在“默认”asp.net核心:
如果您的ExampleClassService
有类似的构造函数:
public ExampleClassService(ApplicationDbContext dbContext)
那么你不需要添加任何特殊工厂 - 这个参数将自动注入DI层(因为你之前已经注册了ApplicationDbContext
),只需写services.AddSingleton<ExampleClassService>()
如果您的服务有一些“特殊”构造函数,那么使用provider
param来获取所需的依赖项:
services.AddSingleton<ExampleClassService>(
provider => new ExampleClassService((ApplicationDbContext)provider.GetService(typeof(ApplicationDbContext)));
但是!在您的示例中,您已将ApplicationDbContext
注册为“范围”而ExampleClassService
注册为“singleton” - 您真的确定您可以/可能/需要使用单个类(单个用于整个应用程序)ExampleClassService
使用您需要为每个范围/请求不同的其他(DbContext)类?
这里可能有设计错误,可能是ExampleClassService也必须“作用域”,或者不在构造函数中需要DbContext。