2009-02-07 35 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