我希望具有以下结构
一个Repository
注入了DbContext
。
Controller
注入了Repository
。
因此,控制器使用存储库,并且存储库中已包含上下文。
所以我在startup.cs
services.AddDbContext<DbContext> x => x.UseSqlServer(Configuration.GetValue<string>("AppSettings:DBCS")));
在上述行正下方注册回购
services.AddScoped(x => new DB.Tasker.LogEntryRepo());
,然后在控制器内部使用DIed存储库
private LogEntryRepo _repo;
public LogsController(LogEntryRepo repo)
{
_repo = repo;
}
问题是编译器抱怨这行services.AddScoped(x => new DB.Tasker.LogEntryRepo());
很可疑,因为仓库显然没有无参数控制器。
完成我要完成的工作的正确方法是什么?
答案 0 :(得分:1)
您在Startup.cs中注册它们
services.AddScoped<IMyRepository, MyRepository>();
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetValue<string>("AppSettings:DBCS")));
将DbContext放入存储库
public MyRepository(MyDbContext myDbContext)
{
_dbContext = myDbContext;
}
然后将存储库DI到Controller中。请注意,我们使用的是IMyRepository
,而不是MyRepository
。在Startup.cs
中注册时,我们告诉它要DI的存储库。确保您的存储库实现了您的界面。
public MyController(IMyRepository myRepository)
{
_repository = myRepository;
}
然后,您可以在控制器中执行类似的操作
_repository.DoSomeDatabaseStuff(param1, param2);
如果您不利用接口,那么您将忽略DI的强大功能。这样一来,您还可以执行诸如创建UnitTest的操作,从而在其中模拟存储库。
services.AddScoped<IMyRepository, MyMockRepository>();
在MyMockRepository中,您可以伪造数据,或确保您的数据库连接和查询正常工作,而只是无法提交或自动回滚更改。