注册具有依赖项注入的服务

时间:2019-11-05 17:00:46

标签: asp.net-core .net-core ef-core-3.0

我希望具有以下结构

一个Repository注入了DbContextController注入了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());很可疑,因为仓库显然没有无参数控制器。 完成我要完成的工作的正确方法是什么?

1 个答案:

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