我感觉自己在打转。似乎无法确定使用LINQ to SQL的正确存储库模式。如果您熟悉Rob Conery的MVC商店前端,您将看到他的实现将由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版本中建议的使用IRepository模式与LINQ to SQL中直接从存储库返回DTO对象的方式?
业务逻辑应该在哪里执行和检查?这是在由存储库在保存/更新时调用的单独层中完成,还是内置于包装类中?