我有一些经常使用的电子商务代码,它使用Linq To SQL将订单保存到数据库。我想删除紧密耦合的Linq to SQL位并传入IRepository,但我仍然对事情感到困惑。
假设我的ICustomerRepository上有一个GetCustomer()方法,它返回一个Customer对象。
我是否需要它来真正返回从该方法传回的ICustomer对象,所以如果我从Linq To SQL切换到说SubSonic它不是问题?
我相信我这样做,如果是这样的话,Linq To SQL是否有办法轻松地将我的Linq To SQL Customer对象转换为我的ICustomer对象,如SubSonics ExecuteSingle(Of)方法?
答案 0 :(得分:3)
如果您希望Customer类是一个没有LINQ附件的普通对象,那么您很可能需要编写一个mapper方法来将基于LINQ的Customer对象转换为普通的Customer域对象。 LINQ to SQL没有内置的此类功能。
为了便于阅读,我已经开始将我的映射方法包装在扩展方法中,这确实有助于保持Repository代码的简单性。例如,我的示例CustomerRepository方法如下:
public Customer GetById(int id)
{
return dataContext.LINQCustomers.Where(c => c.Id == id)
.Single()
.ToDomainObject();
}
和ToDomainObject()方法在扩展方法中定义,如:
public static class ObjectMapper
{
public static Customer ToDomainObject(this Customer linqObject)
{
var domainObject = null
if (linqObject != null)
{
domainObject = new Customer
{
Id = linqObject.Id,
FirstName = linqObject.FirstName,
LastName = linqObject.LastName
}
}
return domainObject;
}
}
或类似的东西。您可以这样做,将域对象转换回LINQ对象,以传回存储库以实现持久性。
答案 1 :(得分:1)
只要Customer是一个普通的旧.NET对象,而不是某个db生成的实体,就可以让它返回一个Customer。您的客户域对象应该不知道如何(或者如果)它可以持久保存到数据库,这应该是从您的存储库返回的内容。在您的存储库中,您可能有一些映射代码 - 这很常见 - 从[从您的存储位置获取数据]到您的域对象的映射。如果您正在使用Linq-to-sql,则此映射将来自Linq-To-Sql生成的Customer表(可能还有其他表 - 您的Customer域对象可能不会将1:1映射到数据库中的特定表)您的客户域对象,它将位于不同的命名空间(很可能是组件)。
答案 2 :(得分:1)
根本没有必要让它成为一个ICustomer。存储库的作用方式使其看起来好像您的持久化实例位于内存中。
public interface ICustomerRepository
{
Customer GetByID(int id);
IEnumerable<Customer> GetByName(string name);
Customer GetByVatCode(string vatCode);
}
有些人还会包括诸如
之类的方法void Add(Customer newCustomer);
void Delete(Customer deleted);
void Update(Customer modified);
后一种方法实现很可能只是更新一个工作单元。
虽然这些概念只是询问客户实例的常用方式,但存储库可以作为一种询问它们的方式,而无需定义如何来询问它们。