Asp.net mvc ASP.NET MVC:控制器构造函数

Asp.net mvc ASP.NET MVC:控制器构造函数,asp.net-mvc,Asp.net Mvc,我刚开始使用asp.NETMVC。要真正开始一个现场项目,还有很长的路要走。目前,我正在使用asp.NETMVC发布的书籍构建一个博客 然而,我不理解BlogController中的2个构造函数(参见下面的问题) Thx 首先 BlogController有一个私有变量“\u repository” Private _repository As BlogRepositoryBase Public MustInherit Class BlogRepositoryBase 'blog en

我刚开始使用asp.NETMVC。要真正开始一个现场项目,还有很长的路要走。目前,我正在使用asp.NETMVC发布的书籍构建一个博客

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

Thx

首先

BlogController有一个私有变量“\u 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连接
下一步

控制器有两个构造函数“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”?那不是另一种类型吗

EntityFrameworkBlogRepository是从BlogRepositoryBase派生的

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

善良


Dan

默认构造函数正在使用参数调用构造函数,该参数带有特定类型BlogRepositoryBase类的新实例。EntityFrameworkBlogRepository必须从此基类派生。指定基类的原因(我可能会使用接口,但我离题了)是因为在测试中可以指定不同类型的存储库——一种可能甚至不通过非默认构造函数直接实例化数据库来连接数据库的存储库。框架将始终使用默认构造函数,因此您必须提供它并使用它提供存储库的适当实现

FWIW——我会这样做(在C语言中——我的大脑还不能很好地转换成VB)

测试为

 public void Test()
 {
      var repository = MockRepository.GenerateMock<IBlogRepository>();

      var controller = new BlogController( repository );

      ...

      repository.VerifyAllExpectations();
 }
公共无效测试()
{
var repository=MockRepository.GenerateMock();
var controller=新的BlogController(存储库);
...
verifyallexpections();
}

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

哈克非常喜欢参考

 public void Test()
 {
      var repository = MockRepository.GenerateMock<IBlogRepository>();

      var controller = new BlogController( repository );

      ...

      repository.VerifyAllExpectations();
 }