Как создать экземпляр объекта со ссылкой на другой объект, который зависит от DI ASP.NET core 2.0? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть конструктор контроллера, в котором я хочу создать экземпляр объекта, который получает доступ к хранилищу посредством внедрения зависимостей.

как это:

ContactController.cs: я получаю ошибку, потому что я не передаю IContactRepository

private ContactOperationsFacade contactOperator;

ContactController(){
    contactOperator = new ContactOperationsFacade(//I want to use DI here);
}

ContactOperationsFacade.cs:

private readonly IContactRepository contactRepository;

public ContactOperationsFacade(IContactRepository contactRepositor){
    this.contactRepository = contactRepository;
}

Как создать экземпляр этого объекта ContactOperationsFacade в конструкторе контроллера, все еще используя DI для хранилища?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

ContactController должно следовать Принцип явных зависимостей

Методы и классы должны явно требовать (обычно через параметры метода или параметры конструктора) любых взаимодействующих объектов, в которых они нуждаются для того, чтобыфункционируют правильно.

Также классы должны зависеть от абстракций и не быть связаны с конкрециями.

Таким образом, предполагая что-то вроде

public class ContactOperationsFacade: IContactOperationsFacade { //<-Note interface/contract

    private readonly IContactRepository contactRepository;

    public ContactOperationsFacade(IContactRepository contactRepositor){
        this.contactRepository = contactRepository;
    }

    //...
}

Контроллер должен зависеть от абстракциичто фасад получен из

public class ContactController: Controller {

    private readonly IContactOperationsFacade contactOperator;

    public ContactController(IContactOperationsFacade contactOperator){
        this.contactOperator = contactOperator;
    }

    //...

}

и предполагает, что все интерфейсы и реализации зарегистрированы в контейнере DI.

services.AddScoped<IContactOperationsFacade, ContactOperationsFacade>();

после регистрации всех зависимостей поставщик услуг должен разрешить ихпри активации контроллера.

0 голосов
/ 12 сентября 2018

В ядре asp.net вы можете создавать цепочки DI, если это позволяют области. Таким образом, если A зависит от B, а контроллер хочет A, вы просто добавляете A и B в контейнер di (часть вашего кода ConfigureServices), и контейнер выяснит это.

Подробнее здесь https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1

...