注册具有依赖注入的服务
Registering a service that has a dependency injection
我想要以下结构
A Repository
有 DbContext
注入其中。
Controller
有 Repository
注入其中。
所以控制器使用了 repo,并且 repo 中已经有上下文。
所以我在startup.cs
中注册了上下文
services.AddDbContext<DbContext> x => x.UseSqlServer(Configuration.GetValue<string>("AppSettings:DBCS")));
在上面一行的正下方注册 repo
services.AddScoped(x => new DB.Tasker.LogEntryRepo());
然后在控制器中使用 DIed repo
private LogEntryRepo _repo;
public LogsController(LogEntryRepo repo)
{
_repo = repo;
}
问题是编译器抱怨这一行 services.AddScoped(x => new DB.Tasker.LogEntryRepo());
是可以预见的,因为 repo 显然没有无参数控制器。
完成我想要完成的任务的正确方法是什么?
您在 Startup.cs
中注册它们
services.AddScoped<IMyRepository, MyRepository>();
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetValue<string>("AppSettings:DBCS")));
将 DbContext DI 到您的存储库
public MyRepository(MyDbContext myDbContext)
{
_dbContext = myDbContext;
}
并将存储库 DI 到您的控制器中。请注意,我们使用的是 IMyRepository
,而不是 MyRepository
。当我们在 Startup.cs
中注册它时,我们告诉它要 DI 哪个存储库。确保您的存储库实现了您的界面。
public MyController(IMyRepository myRepository)
{
_repository = myRepository;
}
然后在你的控制器中你可以做一些事情
_repository.DoSomeDatabaseStuff(param1, param2);
如果您不利用接口,那么您就是在忽略 DI 的力量。这允许您还可以做一些事情,比如在模拟存储库的地方创建一个单元测试。
services.AddScoped<IMyRepository, MyMockRepository>();
在 MyMockRepository 中,您可以伪造数据,或确保您的数据库连接和查询正常工作,但只是无法提交或自动回滚更改。
我想要以下结构
A Repository
有 DbContext
注入其中。
Controller
有 Repository
注入其中。
所以控制器使用了 repo,并且 repo 中已经有上下文。
所以我在startup.cs
services.AddDbContext<DbContext> x => x.UseSqlServer(Configuration.GetValue<string>("AppSettings:DBCS")));
在上面一行的正下方注册 repo
services.AddScoped(x => new DB.Tasker.LogEntryRepo());
然后在控制器中使用 DIed repo
private LogEntryRepo _repo;
public LogsController(LogEntryRepo repo)
{
_repo = repo;
}
问题是编译器抱怨这一行 services.AddScoped(x => new DB.Tasker.LogEntryRepo());
是可以预见的,因为 repo 显然没有无参数控制器。
完成我想要完成的任务的正确方法是什么?
您在 Startup.cs
中注册它们services.AddScoped<IMyRepository, MyRepository>();
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetValue<string>("AppSettings:DBCS")));
将 DbContext DI 到您的存储库
public MyRepository(MyDbContext myDbContext)
{
_dbContext = myDbContext;
}
并将存储库 DI 到您的控制器中。请注意,我们使用的是 IMyRepository
,而不是 MyRepository
。当我们在 Startup.cs
中注册它时,我们告诉它要 DI 哪个存储库。确保您的存储库实现了您的界面。
public MyController(IMyRepository myRepository)
{
_repository = myRepository;
}
然后在你的控制器中你可以做一些事情
_repository.DoSomeDatabaseStuff(param1, param2);
如果您不利用接口,那么您就是在忽略 DI 的力量。这允许您还可以做一些事情,比如在模拟存储库的地方创建一个单元测试。
services.AddScoped<IMyRepository, MyMockRepository>();
在 MyMockRepository 中,您可以伪造数据,或确保您的数据库连接和查询正常工作,但只是无法提交或自动回滚更改。