2009-10-12 166 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在这里有更多的内容。)简而言之,它是一种通过传递它的依赖关系来使代码更易维护和可测试的方法......如果更改存储库类型,则不需要删除大部分代码。

善良,