在configureServices中向服务添加数据库上下文

时间:2016-12-20 13:30:11

标签: asp.net-core

是否可以在自己创建的服务中访问数据库上下文?在下面的代码中,我想用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?);  

    ...
}

1 个答案:

答案 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。