2017-05-25 60 views
1

我正在重構一些代碼,並提取一些執行數據庫CRUD操作到自己的知識庫類中的方法。C#知識庫 - 如何與其他知識庫交互

我有幾個問題,給出以下兩種類型的對象存儲在數據庫:用戶和角色

  1. 我應該建立IUserRepository和IRoleRepository?
  2. 當像做一個用戶角色這樣的事情時,該方法(AssignRoleToUser)應該在哪裏?在IUserRepository或IRoleRepository中?
  3. 如果我想添加一些更復雜的邏輯,比方說,IUserRepository.AddUserAndRoles需要一個IUser,但也需要一個IRole數組,如果IUserRepository得到一個IRoleRepository注入它?
+0

爲什麼要有這麼多的倉庫,不能只有一個? –

+0

@雷洋這是一個很好的問題。我不確定最佳實踐是什麼。我不希望我的代碼臃腫,有很多方法。 – blgrnboy

+0

我不是專家。但我認爲你可以從實體框架中學到一些東西,對於一個數據庫只有一個dbcontext,這就夠了。 –

回答

1

1.我應該創建IUserRepository和IRoleRepository嗎?

您是否需要在UsersRoles上執行操作?如果是,則創建兩者。如果你不需要但是將來可能需要它,那麼不要創建它,而只需要創建它。

2.當做類似分配用戶角色的事情時,該方法(AssignRoleToUser)應該在哪裏生活?在IUserRepository或IRoleRepository中?

當您向用戶分配角色時,很可能會將用戶添加到該角色。因此,如果該方法位於Role存儲庫中,則它更具可讀性。

3,如果我想添加一些更復雜的邏輯,讓我們說,IUserRepository.AddUserAndRoles需要一個IUSER,但也需要IRole數組,IUserRepository應該得到一個IRoleRepository注入呢?

在頂部使用一個圖層,它將與UserRole存儲庫交互,並在那裏執行復雜的工作。

儘量不要從您的存儲庫返回IQueryable(s) - 但是,請記住有兩個流派。但是,如果出於性能原因或者如果引入軟刪除標誌,您必須通過存儲過程替換您的某個操作,那麼您會感謝我。如果您不暴露IQueryable(s),您將在存儲庫中進行更改。但是如果你暴露了它,你將需要找到所有的查詢,並在任何地方改變它們。人們忘記了當他們在Linq(對EF或SQL)中編寫查詢時,他們仍在編寫查詢,但唯一的區別是他們正在使用C#編寫它們。如果他們用SQL編寫它們,他們會考慮將它們寫在所有地方。

另外需要注意的是,不要從所有倉庫中的經典CRUD,FindAll等開始。我看過很多類似這樣的存儲庫,然後我問這個問題:但是我們不刪除命令,爲什麼我們要在Order存儲庫中刪除?確保您的存儲庫反映您在對象上執行的操作。如果您只需要一個R(出於CRUD),那麼只需創建一個Read方法即可。如果你需要找到,然後將其添加到它。根據需要添加方法。如果你還不需要,不要編寫代碼。

+0

謝謝你的迴應!我希望我在正確的道路上,並正在考慮這一點。我的主要驅動器是通過模擬存儲庫來測試業務邏輯層。我的數據庫的一部分由實體框架控制,然後還有一些其他表不屬於EF(附加),並由手動SQL腳本控制。你是否建議將EF層放在存儲庫上? – blgrnboy

+0

是的,因爲針對EF的查詢仍然是查詢。有些人不會同意,但很可能他們正在製作一次性應用程序。但是,我不想在這裏爲自己的每一個人發動一場戰爭。但是,是的,既然你問我,我說是的。除非我正在做一個POC或一個短命的應用程序,否則我總是自己也這樣做。 – CodingYoshi