2016-06-13 5 views
0

MVC 5 웹 응용 프로그램의 자동 스캐 폴딩 컨트롤러에서 종속성 삽입을 사용하는 방법을 배우려합니다. "Dependency Injection"과 "Unity"에 대한 자습서를 찾았지만 필자가 보았던 예제는 더 많은 세상의 다양성과 컨트롤러의 데이터베이스 컨텍스트를 다루는 데 실제로 사용되지 않습니다.리포지토리가없는 DbContext의 종속성 삽입

내게 무슨 뜻인지에 대한 더 나은 예를 들어주기 위해 내가 가진 것과 앞으로 무엇을 하려는지에 대한 코드 스 니펫이 있습니다.

Visual Studio를 사용하여 "Entity Framework를 사용하여 뷰가있는"컨트롤러를 자동으로 스캐 폴딩 할 때 이는 일반적으로 만들어지는 것입니다. 나는 의존성 삽입 (Dependency Injection)을 사용하여, 지금까지 읽은 내용에서

public class TideUploadsController : Controller 
    { 
     // This is the EF Database context placed by the auto-scaffolder 
     private AzMeritContext db = new AzMeritContext(); 

     [HttpGet] 
     public ActionResult Index() 
     {    
      return View(db.TideUploads.ToList()); 
     } 

     /* further CRUD ActionResults not shown */ 

    } 
} 

, 내가 대신 클래스의 인터페이스를 호출하는 생성자를 사용해야합니다. Entity Framework에서 저장소를 래핑하는 것에 대한 여러 가지 리뷰를 읽었습니다. 저장소를 사용하지 않고이 작업을 수행 할 수 있는지 확인하고 싶습니다.

자동 스캐 폴더에 의해 코드에 삽입 된 DbContext 대신 사용해야하는 기존 인터페이스가 있습니까?

// This is the EF Database context placed by the auto-scaffolder 
    private AzMeritContext db = new AzMeritContext(); 

    public TideUploadsController(/* what Interface goes here? */) 
    { 
     //db = ? 
    } 

또는이 상황이 정말 Entity Framework dbContext 주위의 저장소를 래핑해야하는 상황입니까?

나는 책을 읽고 튜토리얼과 비디오를 통해 검색 지난 몇 주 동안 있고, 아직 같은 것을 보여주는 단계별 예를 보지 못했다 :

  • 1 단계 : 컨트롤러를 가지고 당신이 자동으로 스캐 폴딩 한 것
  • 2 단계 : 수행하십시오 ...
  • 단계 n : 컨트롤러가 단단히 결합 된 것이 아니라 데이터베이스 컨텍스트와 느슨하게 결합되어 있습니다.

답변

1

글쎄, 나를 위해 의존성 주입 뒤에 장점 중 하나는 당신이 기본적으로 조롱 가능한 개체 또는 다른 구현으로 당신의 "의존성"을 분리하는 것입니다 IMHO 저장소 패턴은 갈 일반적인 방법입니다, 나는 아무것도 볼 수 없습니다 래퍼를 사용하고 컨테이너에서 인터페이스와 구현을 구성해야하는 다른 방법.

나는 당신이 개념을 잘 알고있는 것 같아요 :

public class UserRepository:IUserRepository 
{ 
    public UserRepository(){ 
    // you usually instanciate your context here 
    // private AzMeritContext db = new AzMeritContext(); 
    } 
    User GetUserById(int Id){ 
    // do your query to get a single user 
    } 
} 

implementation 나에게 좋아 보인다.

다음 컨트롤러는 다음과 같아야합니다

public class TideUploadsController : Controller 
     { 

      public TideUploadsController(IUserRepository userRepository){ 
       // constructor injection 
       // assign your user repository to a local variable outside of the constructor scope something like _userRepository 
      } 

      [HttpGet] 
      public ActionResult Index() 
      {    
       return View(_userRepository.GetUserById(1)); 
       // let's assume your variable's name is _userRepository 
      } 

      /* further CRUD ActionResults not shown */ 

     } 
    } 

단지 방법을 구현해야합니다 귀하의 인터페이스는 등,

내 두 센트를 사용하고 컨트롤러, 서비스를 노출하고 싶은 것을 기억 도움이되기를 바랍니다.

+0

리포지토리에 대한 모든 논점에 대해 내가 아직도 보았던 한 가지 단점은 추가적으로 많은 타이핑이 포함된다는 것입니다. 일반적인 저장소 인터페이스의 예제를 찾았지만 generic 리포지토리를 아직 보지 못했기 때문에 모든 컨텍스트 및 모델 쌍을 생성자에 삽입하고 동일한 동사 (get, insert 등)를 사용할 수 있습니다. 정말로 일반적인 저장소에 대한 아이디어가 있습니까? –

+0

아마도 "일반 저장소"를 만들고 생성자에서 DBContext 삽입을 수행해야합니다.이 아이디어는 http://blog.gauffin.org/2013/01/repository-pattern-done-right/와 당신은 거기에 쓰기 및 많은 데이터베이스 액세스를 래핑하는 코드가 많이있다. –