2009-10-12 7 views
1

저는 방금 asp.net mvc를 시작했습니다. 실제 프로젝트에 도달하기까지는 먼 길입니다. 지금은 asp.net mvc unleashed 책을 사용하여 블로그를 구축하기 위해 노력하고 있습니다.ASP.NET MVC : 컨트롤러 생성자

그러나, 나는 (아래 질문 참조)

FIRST

들으 ... BlogController에서이 생성자를 이해하지 못하는

BlogController은 '_repository을'개인 변수를 가지고

Private _repository As BlogRepositoryBase 

Public MustInherit Class BlogRepositoryBase 
    'blog entry methods 
    Public MustOverride Function ListBlogEntries() As List(Of BlogEntry) 
    Public MustOverride Sub CreateBlogEntry(ByVal BlogEntryToCreate As BlogEntry) 
    Public MustOverride Function QueryBlogEntries() As IQueryable(Of BlogEntry) 
End Class 
  • BlogReposi toryBase는 _ EntityFrameworkBlogRepository 상속!하는 EntityFrameworkBlogRepository가 BlogDBEntities

NEXT와 연결

  • 제어기 갖는 2- 건설자 새로운 '및

    Public Sub New() 
        Me.New(New EntityFrameworkBlogRepository()) 
    End Sub 
    
    Public Sub New(ByVal repository As BlogRepositoryBase) 
        _repository = repository 
    End Sub 
    

    '파라미터 새로운 ' 질문 중

    • 생성자는 어떻게되는지 알지 못합니다.
    • 'EntityFrameworkBlogRepository'유형의 클래스를 BlogRepositoryBase로 'sub new'에 전달할 수 있습니까? 다른 타입이 아닌가?
  • 답변

    3

    는 기본 생성자는 BlogRepositoryBase 클래스의 특정 유형의 새 인스턴스를 매개 변수로 생성자를 호출한다. EntityFrameworkBlogRepository는이 기본 클래스에서 파생되어야합니다. 기본 클래스를 지정하는 이유는 (인터페이스를 사용했지만 탈퇴 한 것입니다.) 테스트에서 저장소의 다른 유형을 지정할 수 있습니다. 인스턴스화를 통해 데이터베이스에 연결하지 않는 저장소 일 수도 있습니다 기본이 아닌 생성자를 통해 직접 전달됩니다. 프레임 워크는 항상 기본 생성자를 사용하므로이를 제공하고이를 사용하는 저장소의 적절한 구현을 제공해야합니다.

    FWIW -이 방법은 (C#에서 - 뇌가 VB로 변환 할만큼 잘 작동하지 않습니다.)

    protected IBlogRepository Repository { get; set; } 
    
    public BlogController() : this(null) {} 
    
    public BlogController(IBlogRepository repository) 
    { 
         this.Repository = repository ?? new EntityFrameworkBlogRepository(); 
         ... 
    } 
    

    public void Test() 
    { 
         var repository = MockRepository.GenerateMock<IBlogRepository>(); 
    
         var controller = new BlogController(repository); 
    
         ... 
    
         repository.VerifyAllExpectations(); 
    } 
    
    0

    EntityFrameworkBlogRepository이 생성자에 BlogRepositoryBase

    '매직'에서 유래는 Dependency Injection라고합니다. 즉, 위키는 여기에 더 많은 것을 가지고 있습니다. 간단히 말해서, 코드를 의존성을 넘어서서 유지 보수가 가능하고 테스트 할 수있게 만드는 방법입니다. 저장소 유형을 변경하면 코드의 대부분을 제거 할 필요가 없습니다.

    친절,