四、 创建论坛仓库类
接下来,我们需要创建一个ForumRepository类。论坛应用程序将使用该ForumRepository类实现与数据库的交互。列表3提供了这个类的实例代码。
列表3—Models\ForumRepository.cs
using MvcFakes;
using System.Linq;
using System.Data.Linq;
using LinqToSqlExtensions;
using Microsoft.Web.Mvc;
using System.Collections.Generic;
namespace MvcForums.Models
{
public class ForumRepository : IForumRepository
{
private IDataContext _dataContext;
public ForumRepository()
: this(new DataContextWrapper("conForumsDB", "~/Models/ForumsDB.xml"))
{ }
public ForumRepository(IDataContext dataContext)
{
_dataContext = dataContext;
}
public IList<Message> SelectThreads()
{
var messages = _dataContext.GetTable<Message>();
var threads = from m in messages
where m.ParentId == null
select m;
return threads.ToList();
}
}
}
using System.Linq;
using System.Data.Linq;
using LinqToSqlExtensions;
using Microsoft.Web.Mvc;
using System.Collections.Generic;
namespace MvcForums.Models
{
public class ForumRepository : IForumRepository
{
private IDataContext _dataContext;
public ForumRepository()
: this(new DataContextWrapper("conForumsDB", "~/Models/ForumsDB.xml"))
{ }
public ForumRepository(IDataContext dataContext)
{
_dataContext = dataContext;
}
public IList<Message> SelectThreads()
{
var messages = _dataContext.GetTable<Message>();
var threads = from m in messages
where m.ParentId == null
select m;
return threads.ToList();
}
}
}
首先注意到,上面这个ForumRepository类提供了一个名字为SelectTheads()的public方法。此方法负责返回所有的ParentId为NULL的消息。这个方法返回参数形式为一个IList—该列表集合实现IList接口。
另外还应注意到,这个ForumRepository类支持构造器依赖性注入。这个类有两个构造器函数。如果你实例化该类,但是没有提供一个实现了IDataContext接口的类,那么ForumRepository类默认会使用一个DataContextWrapper类的实例(其中,DataContextWrapper类是一个添加了IDataContext接口的DataContext类的瘦包装器)。
在单元测试,我们可以把一个虚构的DataContext传递到上面ForumRepository类的构造器中。通过这种方式,我们就可以对ForumRepository类进行测试而不必接触到实际的数据库。
列表4给出了实现了IForumRepository接口的ForumRepository类的完整定义。
列表4–Models\IForumRepository.cs
using Microsoft.Web.Mvc;
using MvcFakes;
using System.Collections.Generic;
namespace MvcForums.Models
{
public interface IForumRepository
{
IList<Message> SelectThreads();
}
}
using MvcFakes;
using System.Collections.Generic;
namespace MvcForums.Models
{
public interface IForumRepository
{
IList<Message> SelectThreads();
}
}
【注意】因为ForumRepository类中利用了LINQ to SQL技术,所以你必须在你的应用程序中添加一个对程序集System.Data.Linq的引用。