Регистрация службы с внедрением зависимостей - PullRequest
0 голосов
/ 05 ноября 2019

Мне бы хотелось, чтобы следующая структура

A Repository содержала DbContext для инъекций. A 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());, поскольку репо, очевидно, не имеет контроллера без параметров. Как правильно достичь того, чего я пытаюсь достичь?

1 Ответ

1 голос
/ 05 ноября 2019

Вы регистрируете их в Startup.cs

services.AddScoped<IMyRepository, MyRepository>();
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetValue<string>("AppSettings:DBCS")));

DI DbContext в ваш репозиторий

public MyRepository(MyDbContext myDbContext)
{
   _dbContext = myDbContext;
}

И DI репозиторий в ваш контроллер. Обратите внимание, что мы используем IMyRepository, а не MyRepository. Мы сообщаем ему, какой репозиторий для DI, когда регистрируем его в Startup.cs. Убедитесь, что ваш репозиторий реализует ваш интерфейс.

public MyController(IMyRepository myRepository)
{
   _repository = myRepository;
}

Тогда в вашем контроллере вы можете делать такие вещи, как

_repository.DoSomeDatabaseStuff(param1, param2);

Если вы не используете интерфейс, то вы 'игнорируя силу DI. Это позволяет вам также создавать такие вещи, как создание UnitTest, в котором вы макетируете репозиторий.

services.AddScoped<IMyRepository, MyMockRepository>();

В MyMockRepository вы можете подделывать данные или гарантировать, что ваши соединения с базой данных и запросы работают, но просто не в состоянии зафиксировать илиавтоматический откат изменений.

...