三、 修改论坛Repository
为了满足新的单元测试,我不得不在ForumRepository类中添加两个新的方法。幸好,因为我们使用的是LINQ to SQL,所以实现该新的方法仅要求较少的代码。列表2给出了该新版本的ForumRepository类。
列表2–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.ParentThreadId == null
select m;
return threads.ToList();
}
public IList<Message> SelectMessages(int threadId)
{
var messages = _dataContext.GetTable<Message>();
var threads = from m in messages
where (m.Id == threadId || m.ParentThreadId == threadId)
select m;
return threads.ToList();
}
public Message AddMessage(Message messageToAdd)
{
_dataContext.Insert(messageToAdd);
return messageToAdd;
}
}
}
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.ParentThreadId == null
select m;
return threads.ToList();
}
public IList<Message> SelectMessages(int threadId)
{
var messages = _dataContext.GetTable<Message>();
var threads = from m in messages
where (m.Id == threadId || m.ParentThreadId == threadId)
select m;
return threads.ToList();
}
public Message AddMessage(Message messageToAdd)
{
_dataContext.Insert(messageToAdd);
return messageToAdd;
}
}
}
该SelectMessages()方法返回一个对应于一个特定线程的消息集合。AddMessage()方法把一个新的消息添加到数据库中。当添加一个消息(它启动一个新的线程)或在一个现有线程上添加一个应答时调用这个方法。