注册具有依赖注入的服务

Registering a service that has a dependency injection

我想要以下结构

A RepositoryDbContext 注入其中。 ControllerRepository 注入其中。

所以控制器使用了 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 中,您可以伪造数据,或确保您的数据库连接和查询正常工作,但只是无法提交或自动回滚更改。