2009-10-12 167 views
1

我剛剛開始與asp.net mvc。在真正開展現場項目之前還有很長的路要走。目前我正在使用asp.net mvc釋放的書建立一個博客。ASP.NET MVC:控制器構造函數

不過,我不明白在BlogController 2個構造函數(見下面的問題)

THX ...

FIRST

的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

下一次連接

控制器有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必須從此基類派生。你指定基類的原因(我將使用一個接口,但我離題了)在測試中是這樣的,你可以指定一個不同類型的存儲庫 - 一個可能甚至不通過實例化連接到數據庫它直接通過非默認的構造函數。框架總是使用默認構造函數,因此您必須提供它並使用它提供合適的存儲庫實現。 (這在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。 (Wiki在這裏有更多的內容。)簡而言之,它是一種通過傳遞它的依賴關係來使代碼更易維護和可測試的方法......如果更改存儲庫類型,則不需要刪除大部分代碼。

善良,