我想创建一个包含另一个依赖项的类型。
原因是,我可以使控制器依赖具有更多抽象功能的基础结构包装器,然后再实际访问数据层。
这是具有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'。
答案 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>();