具有嵌套依赖项的类型的依赖项注入

时间:2018-07-26 23:00:34

标签: c# asp.net-core dependency-injection

我想创建一个包含另一个依赖项的类型。

原因是,我可以使控制器依赖具有更多抽象功能的基础结构包装器,然后再实际访问数据层。

这是具有dbcontext依赖项的包装器

public Repository(IdbContext context)
{
    _context = context;
}

控制器构造函数:

private readonly Repository _repo;

public TheController(IRepository repo)
{
    _repo = repo;
}

Startup.cs 中,ConfigureServices

services.AddDbContext<dbContext>(options =>         
    options.UseSqlServer(Configuration.GetConnectionString("dbContext")));
services.AddTransient<IRepository, Repository>();

Program.cs 中,

using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var context = services.GetRequiredService<dbContext>();
    var _repo = services.GetRequiredService<IRepository>();
    ...
}

GetRequiredService<IRepository>()失败,并出现以下异常:

  

System.InvalidOperationException:'无法解析类型的服务         尝试激活时出现“ namespace.Models.IdbContext”         'namespace.Repositories.Repository'。

2 个答案:

答案 0 :(得分:2)

您需要注入与注册相同的类型。

如果您注册dbContext,请注入dbContext

services.AddDbContext<dbContext>(options => ...);

public Repository(dbContext context)
{
    _context = context;
}

如果您注册IdbContext,请注入IdbContext

services.AddDbContext<IdbContext, dbContext>(options => ...);

public Repository(IdbContext context)
{
    _context = context;
}

以下是作为可运行演示的后一个选项:

https://github.com/shaunluttin/asp-net-core-db-context-interface-injection

答案 1 :(得分:2)

IdbContext接口与dbContext实现相关联。

假设

public class dbContext: DbContext, IdbContext  {
    //...
}

失败是因为未注册,并且提供者在将IdbContext注入存储库时不知道要初始化什么。

services.AddDbContext<IdbContext, dbContext>(options =>         
    options.UseSqlServer(Configuration.GetConnectionString("dbContext")));
services.AddTransient<IRepository, Repository>();