我觉得我在绕圈子跑。对于使用LINQ to SQL的正确存储库模式,我似乎无法下定决心。如果您熟悉Rob Conery 的 MVC Storefront,您会看到他的实现用另一个类包装了 LINQ 生成的模型,并将 LINQ 生成的模型简单地视为数据传输对象(DTO)。它看起来像这样:
//Custom wrapper class.
namespace Data
{
public class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public IList<Address> Addresses {get;set;}
}
}
//Linq-Generated Class - severly abbreviated
namespace SqlRepository
{
public class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public EntitySet<Address> {get;set;}
}
}
//Customer Repository
namespace SqlRepository
{
public class UserRepository : IUserRepository
{
private _db = new DB(); //This is the Linq-To-Sql datacontext
public IQueryable GetCusomters()
{
return
from c in _db.Customers
select new Customer // This is the wrapper class not the gen'd one
{
Id = c.Id,
Name = c.Name,
Addresses = new LazyList(c.Addresses)
};
}
这样做的好处是什么(使用包装类),而不是 Mike Hadlow在他的 IRepository<T> 版本中使用带有 LINQ to SQL 的 IRepository 模式建议的方式,他只是从存储库?
应该在哪里执行和检查业务逻辑?这是在保存/更新时由存储库调用的单独层中,还是内置到包装器类中?