我刚刚开始使用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
下一步
控制器有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
问题
答案 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非常引用。