Если я передам временный экземпляр конструктору и дважды использую его в одном из методов, получу ли я новые экземпляры? - PullRequest
0 голосов
/ 21 января 2020

Я использую asp. net основной контейнер по умолчанию для DI. Не слишком уверен, как переходный процесс работает в данной ситуации ниже.

StudentController: Controller
{

  private readonly StudentRepository _repository ;

  //Note: StudentRepository is transient (initialized from startup.cs)
  StudentController (StudentRepository repository){
  _repository = repository;
  }

  public List<object> GetStudents()
  {
        //first call = _repository.GetStudents();
        //.....
        //second call = _repository.GetStudents();

        //Are above instances different?
  }
}

Ответы [ 2 ]

1 голос
/ 21 января 2020

Независимо от внедрения зависимости, этот метод может использовать только один и тот же экземпляр, поскольку _repository установлен только для чтения. Это означает, что другой экземпляр StudentRepository не может быть назначен ему в течение срока службы контроллера.

Хотя в. net core AsTransient означает создание нового экземпляра каждый раз, когда это требуется, это будет только быть каждый раз, когда вызывается конструктор, т. е. один раз на HTTP-запрос.


Обновление согласно комментарию

Чтобы увидеть, где AsTransient будет иметь значение, мы потребуется ввести еще один уровень абстракции.

Если мы добавим слой service / business logi c следующим образом:

class AService
{
    private readonly StudentRepository _repository;

    AService(StudentRepository repository)
    {
        _repository = repository;
    }
}

class AnotherService
{
    private readonly StudentRepository _repository;

    AnotherService(StudentRepository repository)
    {
        _repository = repository;
    }
}

Затем добавьте службы в контроллер:

class StudentController : Controller
{
    private readonly AService _aService;
    private readonly AnotherService _anotherService;

    StudentController (AService aService, AnotherService anotherService)
    {
        _aService = aService;
        _anotherService = anotherService;
    }
}

Каждый сервис будет иметь другой StudentRepository экземпляр, так как новый создается при вызове каждого конструктора.

При изменении AsTransient на AsScoped платформа будет повторно использовать один экземпляр для полного HTTP-запроса, что означает, что обе службы будут иметь один и тот же экземпляр.

1 голос
/ 21 января 2020

Экземпляр _repository точно такой же. Вызов GetStudents() произойдет дважды, но через тот же экземпляр класса репозитория, который вы вводите.

...