2016-12-19 32 views
1

爲了實現存儲庫模式,我發現的所有示例都非常簡單(忽略連接)或使用實體框架。DAL使用dapper的存儲庫模式連接

我的數據庫表如下所示

tblUser {id, fname, lname, email, password, dateAdded} 
tblAccount {id, name, isActive, dateAdded} 
tblAccountUser {userId, accountId, isActive, dateAdded} 

一個用戶可以有多個帳戶和帳戶可以有多個用戶。 tblUserAccount有一個布爾值,告訴我們用戶是否對帳戶有效以及何時添加了用戶。

我的pocos直接映射到具有關係的附加屬性的表。有沒有更好的方法來做到這一點?我想不出更好的方式讓我的存儲庫返回類似於GetUsersWithAccounts(userId)的關係。

tblUser { 
    guid id, 
    string fname, 
    string lname, 
    string email, 
    string password, 
    date dateAdded, 
    IList<tblAccount> accounts 
} 

tblAccount { 
    guid id, 
    string name, 
    bool isActive, 
    date dateAdded, 
    IList<tblUser> users 
} 

//should i have a tblAccountUser poco with something like 
//{tblUser user, tblAccount account, bool isActive, date dateAdded} 

我有以下的庫:

UserRepository { 
    Add()... 
    ... 
    tblUser GetById(guid userId) {} 
    IEnumberable<tblUser> GetAll() {} 

    //was unsure if Account repo should retrieve a user's accounts or if the user repo should. 
    //using uow.User.GetAccounts(user.id) seems natural but please feel free to let me know what you think 
    IEnumberable<tblAccount> GetAccounts(guid userId){} 

    //this is the one i was really unsure about 
    //this would return tblUser obj with its tblUser.Accounts filled. 
    IEnumberable<tblUser> GetAllWithAccounts() 
} 

AccountRepository{ 
    Add() 
    ... 
    AddUser(guid userId) //only adds relation to tblAccountUser Makes sense? 

} 

//Should i have a repository for the Account <-> User relations? 

問題是所有的地方,總結一下:

  1. 當返回從我的回購波蘇斯我應該如何回報關係。正如我在上面的pocos中顯示的那樣,還是有更好的方法?
  2. 我的關係表應該得到他們自己的pocos嗎?如果是這樣,是否只有當他們有額外的數據,如isActive和用戶/賬戶特定的設置。
  3. 在我的倉庫裏,我不確定哪個倉庫在處理關係時應該處理特定的請求。
  4. 我應該有另一個賬戶/用戶關係的回購?

批評,鏈接,歡迎大家的到來謝謝。

編輯:

附加說明:應該提到。我想讓用戶/賬戶在一起的原因是因爲他們將在一個網格中,我們可以激活/停用並修改用戶或其賬戶的值。

回答

1

A 1 & 3當您的UserRepository方法返回一個tblUser對象時,它不需要填充帳戶。所有非集合屬性都應該由UserRepository處理。 在accounts屬性的getter中,調用AccountRepository中的方法來調用數據庫,以在第一次調用getter時獲取用戶的所有帳戶。

A 2關係表不需要他們自己的pocos。

A 4創建另一個存儲庫來分別處理帳戶。

+0

A1&3之前應該說過,但是將它用於網格,因此所有用戶都必須獲得所有帳戶。 10k以上的通話表現會很慢。好主意我可能會在其他地方使用。 A 2.我在哪裏可以找到tblAccountUser.IsActive,以查看用戶是否對特定帳戶有效。 A4。有一個帳戶是你的意思是一個tblAccountUsers? – ozz

+0

A 2在AccountRepository中。您可以篩選非活動賬戶或將IsActive作爲賬戶對象中的一個屬性返回。 A 4我的意思是AccountRepository。創建像GetAccountsByUserId – detale

+0

方法我試着做你建議通過不活動/活動過濾,並單獨顯示它們,這是一種混亂,因爲我們需要能夠通過user.email和account.name搜索取決於哪個更相關。 IsActive是帳戶和用戶帳戶關係的屬性,這使得它獨一無二。由於存在額外的列而不僅僅是(AccountID,UserID),我被建議在其他地方爲關係創建poco。到目前爲止哪個工作更好。 – ozz

0

也許部分答案是解壓。存儲庫模式的重要組成部分是,您有一個包裝數據庫調用的類,它返回pocos,而不是ADO類,可讓您進行單元測試。整形部分是與「select」方法在同一類中插入/更新/刪除方法的組合,讓您忘記了您正在處理數據庫。爲什麼你想忘記是另一個問題。

一旦你有你的回購類,提取它的接口。粗略地說,1個存儲庫對應於1個查詢對應於1個平坦結果集。在存儲庫中沒有加入的概念。數據庫中的連接可能與您的應用程序代碼中的集合相對應:用戶的實例將包含列表或詞典或IEnumerable of Accounts,並且不會停止具有用戶集合的帳戶實例。但用戶和帳戶不是存儲庫。它們可能是由存儲庫返回的POCO。更通常的是,它們被定義在應用程序的另一個層中,並封裝數據層返回的POCO。這帶來了明顯的一致性問題,您可以自行解決:-)存儲庫模式不會幫助您。如果用戶在用戶屏幕上選擇帳戶,那麼您的User對象可能會調用某個存儲庫某處插入AccountUser的方法。如果您在賬戶屏幕上選擇用戶,則賬戶對象可能會調用相同的方法。該方法可能在UserRepo,或AccountRepo或SomeOtherRepo一起。

嘗試和使用Dapper來模擬實體框架將是一個錯誤。不要想象你可以編寫一次你的倉庫,然後永遠不要碰它們。 Dapper適用於熱愛數據庫的民衆,並經常與之交流。 Repos可能會相互重疊。