2010-03-19 67 views
2

我希望標題和下面的文字清晰,我對正確的術語不太熟悉,所以如果我弄錯了任何錯誤,請糾正我。我第一次使用Linq ORM,並想知道如何解決以下問題。關於Linq to SQL映射對象設計的建議

說我有兩個DB表:

User 
---- 
Id 
Name 


Phone 
----- 
Id 
UserId 
Model 

LINQ的代碼發生器產生一束實體類。

然後我寫我自己的類和接口包裝這些的Linq類:

class DatabaseUser : IUser 
{ 
    public DatabaseUser(User user) 
    { 
     _user = user; 
    } 

    public Guid Id 
    { 
     get { return _user.Id; } 
    } 

    ... etc 
} 

到目前爲止好。

現在很容易找到來自Phones.Where(p => p.User = user)的用戶手機,但肯定API的消費者不需要編寫自己的Linq查詢來獲取數據,所以我應該將此查詢包裝在某個函數或屬性中。

所以問題是,在這個例子中,你會添加一個Phones屬性給IUser嗎?

換句話說,我的接口是否應該專門模擬我的數據庫對象(在這種情況下,電話不屬於IUser),還是它們實際上只是提供一組功能和屬性,這些功能和屬性在概念上與用戶在這種情況下它)?

這兩個視圖似乎都有缺陷,但我想知道是否有標準的解決方法。或者只是你可以分享的任何一般智慧詞彙。

我的第一個想法是使用擴展方法,但實際上在這種情況下不起作用。

回答

2

我有一些糟糕的經歷試圖在接口後面抽象LINQtoSQL實體。這是前一段時間,但從記憶來看,主要問題是它完全打破了聯想。舉例來說,如果你有一個Customer - >Order關係,你最終會露出它作爲一個ICustomer,與IOrder秒的收集,這意味着Customer必須做一些尷尬映射投它Order對象的內部集合作爲IOrder小號。

然後你必須假設當一個IOrder得到通過,我們可以把它投到Order。否則LINQtoSQL無法處理它,但是這首先破壞了界面。

我強烈建議你不要試圖抽象掉實體類,LINQtoSQL實際上並沒有在其中放入任何真正的魔法,DataContext處理它們的持久生命週期,所以它們仍然是可測試的。

,我要尋找的界面背後隱藏會使用存儲庫樣式類與DataContext的相互作用,例如方面:

public interface IPhoneRepository 
{ 
    IEnumerable<Phone> GetPhonesForUser(User user); 
} 

public class L2SPhoneRepository : IPhoneRepository 
{ 
    private readonly MyDataContext context; 

    public L2SPhoneRepository(MyDataContext context) 
    { 
     this.context = context; 
    } 

    public IEnumerable<Phone> GetPhonesForUser(User user) 
    { 
     return context.Phones.Where(p => p.User == user); 
    } 
} 
0

您的界面應該模擬如何使用對象。既然你試圖抽象,那麼消費者就不必查詢數據庫。無論您是將其設置爲屬性還是單獨的函數調用(即GetPhones()),都完全取決於您。既然你完全包裝了東西,你必須對你想要加載對象的深度/延遲性做出一些選擇。

0

你應該電話屬性添加到IUSER並使其可爲空,因此對於沒有電話的用戶,它將爲空。

既然你不希望API的消費者編寫查詢,應該比你實現類似功能的getUser()..等

下面是在ASP文章ABT n層應用的一個很好的列表。淨

http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=416

0

我傾向於考慮LINQ2SQL相關的東西是數據訪問代碼的實現細節,像數據庫的真實結構,不一定要暴露於系統的其他部分。

如果你的API將被其他人使用,它應該是內聚的,易於使用,並且不會被消費者不需要知道的東西混淆。如果我正在處理用戶和他們的手機,我並不想知道DataContexts或(呃)DataSets。另外,通過保持大部分代碼不知道L2S和數據庫,您將可以更輕鬆地進行測試,進行模式更改(哦,現在用戶表需要記錄所做的每個更改的歷史記錄),甚至更改徹底改變ORM。