2009-02-07 46 views
1

我有一些电子商务代码,我经常使用Linq To SQL将订单保存到数据库。我想删除紧密耦合的Linq到SQL位,并传递一个IRepository,但是我仍然对事物感到困惑。关于返回对象的IR知识库混淆

假设我的ICustomerRepository上有一个GetCustomer()方法,它返回一个Customer对象。

我是否需要它真的返回从该方法传回的ICustomer对象,因此如果从Linq转换到SQL来表示SubSonic它不是问题?

我相信我这样做,如果是这样的话,有没有办法在Linq To SQL中轻松地将我的Linq To SQL Customer对象转换为我的ICustomer对象,如SubSonics ExecuteSingle(Of)方法?

回答

3

如果你希望你的Customer类是一个没有LINQ附件的普通对象,那么你很可能需要编写一个mapper方法来将基于LINQ的Customer对象转换为你的普通Customer域对象。 LINQ to SQL没有内置的这种功能。

我已经开始将我的映射方法包装在扩展方法中以提高可读性,并且它确实有助于简化存储库代码。举例来说,一个例子CustomerRepository方法我的样子:

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; 
    } 
} 

或类似的东西:

public Customer GetById(int id) 
{ 
    return dataContext.LINQCustomers.Where(c => c.Id == id) 
            .Single() 
            .ToDomainObject(); 
} 

和ToDomainObject()方法是在类似的扩展方法定义。你也可以做同样的事情,将你的域对象转换回一个LINQ对象,并将其传回到你的资源库中进行持久化。

1

只要Customer是普通的旧.NET对象,而不是一些数据库生成的实体,就可以让它返回一个Customer。您的客户域对象应该不知道如何(或如果)它可能被持久保存到数据库中,这应该从您的存储库中返回。在你的仓库中,你可能有一些映射代码 - 这是很常见的 - 从[然而你从存储位置获取数据]映射到你的域对象。如果您使用的是Linq-to-sql,那么这个映射将来自Linq-To-Sql生成的Customer表(也可能是其他表) - 您的Customer域对象可能不会将1:1映射到数据库中的特定表)添加到您的客户域对象,该域对象将位于不同的名称空间(最有可能是程序集)中。

1

根本没有必要使它成为一个客户。存储库的行为方式使其看起来好像持久实例在内存中一样。

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); 

后一种方法的实现将最有可能只更新工作单元。

尽管这个概念是这些只是询问客户实例的常见方式,但存储库可以作为询问它们的一种方式,而不需要定义如何请求它们。

+0

因此,如果Customer on ICustomerRepository是由Linq To SQL或SubSonic创建的,并且其类型可能不同? – Slee 2009-02-07 21:34:04

+0

客户在您的ICustomerRepository中定义了哪里? – Slee 2009-02-07 21:35:17