ASP.NET MVC:Controller构造函数

时间:2009-10-12 12:08:52

标签: asp.net-mvc

我刚刚开始使用asp.net mvc。在你真正进入现场项目之前还有很长的路要走。目前我正在使用asp.net mvc释放的书来构建一个博客。

但是,我不理解BlogController中的2个构造函数(参见下面的问题)

... THX

第一

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
  • BlogRepositoryBase由EntityFrameworkBlogRepository _
  • 继承
  • EntityFrameworkBlogRepository与BlogDBEntities连接

下一步

控制器有2个构造函数'new'和'new with a parameter'

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 个答案:

答案 0 :(得分: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();
 }

答案 1 :(得分:0)

EntityFrameworkBlogRepository派生自BlogRepositoryBase

构造函数中的“魔术”称为Dependency Injection。 (Wiki在这里有更多内容。)简而言之,它是一种通过传递它的依赖性来使代码更易于维护和可测试的方法......如果你更改了存储库类型,则不需要删除大部分代码。

善,

答案 2 :(得分:0)

编码自定义IControllerFactory或DefaultControllerFactory继承类。和SetControllerFactory global.asax。

Haaked非常引用。

TDD and Dependency Injection with ASP.NET MVC