컨트롤러에서 ASP NET 5의 EF7 현재 데이터베이스 컨텍스트를 해결하는 방법?

asp.net-core entity-framework-core

문제

ASP NET 5 / EF 7 응용 프로그램에서 일부 방법 (컨트롤러가 아님)에서 사용하기 위해 요청 당 하나의 컨텍스트를 가져 오려고합니다.

불행히도 설명서에서 대답을 찾지 못했습니다. ASP.NET vNext 템플릿 및 예제 aspnet / MusicStore

수락 된 답변

이러한 목적을 달성하기 위해 몇 가지 방법을 사용할 수 있습니다.

.AddDbContext<ApplicationDbContext>(); 사용 .AddDbContext<ApplicationDbContext>(); ( ConfigureServices() 메소드에서) Dependency Injection 시스템에 ApplicationDbContext 를 등록하는 방법은 Scoped 의존성 (또는 "요청 당")으로 등록된다는 사실로 이어진다. 이로써 당신은 Dependency Injection 시스템에서만 그것을 얻을 필요가 있습니다.

  1. dbContext를 클래스에 사용하는 생성자 메서드의 매개 변수로 dbContext를 추가하십시오. 그런 다음 Dependency Injection 시스템을 사용하여이 클래스를 가져와야합니다 (예 : 컨트롤러의 생성자 매개 변수로 추가).

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
  2. 그러나 컨텍스트를 얻기 위해 생성자 삽입을 사용하지 않으려는 경우 GetService() 메서드를 사용하여 필요한 종속성을 얻을 수 있습니다 (하지만 아래 예제에서는 ServiceProvider 인스턴스에서 생성자 주입을 통해 가져 오는 것이 필요합니다).

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    
  3. 첫 번째 메소드에서 GetService() 메소드를 통해 HabitService 를 얻을 수 있습니다 (생성자 삽입을 통하지 않음).

    public class HabitsController : Controller
    {
        public HabitsController(HabitService habitService)
        {
    
        }
    }
    
    public class HabitService
    {
        private GetHabitsContext _dbContext;
    
        public HabitService(GetHabitsContext dbContext)
        {
            _dbContext = dbContext;
        }
    }
    

발언에 대해 Tseng에게 감사드립니다.

컨테이너에 객체를 주입하는 것은 매우 나쁜 습관입니다. 컨테이너는 컴포지션 루트 및 특정 유형의 팩토리 (도메인 / 비즈니스 계층이 아닌 응용 프로그램 수준에서 구현 됨)에서만 참조해야합니다.


HabitsController의 dbContext와 HabitService의 _dbContext는 서로 다른 컨텍스트입니다!

나는 이것이 동일한 문맥임을 확인했다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.