1.我應該創建IUserRepository和IRoleRepository嗎?
您是否需要在Users
和Roles
上執行操作?如果是,則創建兩者。如果你不需要但是將來可能需要它,那麼不要創建它,而只需要創建它。
2.當做類似分配用戶角色的事情時,該方法(AssignRoleToUser)應該在哪裏生活?在IUserRepository或IRoleRepository中?
當您向用戶分配角色時,很可能會將用戶添加到該角色。因此,如果該方法位於Role
存儲庫中,則它更具可讀性。
3,如果我想添加一些更復雜的邏輯,讓我們說,IUserRepository.AddUserAndRoles需要一個IUSER,但也需要IRole數組,IUserRepository應該得到一個IRoleRepository注入呢?
在頂部使用一個圖層,它將與User
和Role
存儲庫交互,並在那裏執行復雜的工作。
儘量不要從您的存儲庫返回IQueryable
(s) - 但是,請記住有兩個流派。但是,如果出於性能原因或者如果引入軟刪除標誌,您必須通過存儲過程替換您的某個操作,那麼您會感謝我。如果您不暴露IQueryable
(s),您將在存儲庫中進行更改。但是如果你暴露了它,你將需要找到所有的查詢,並在任何地方改變它們。人們忘記了當他們在Linq(對EF或SQL)中編寫查詢時,他們仍在編寫查詢,但唯一的區別是他們正在使用C#編寫它們。如果他們用SQL編寫它們,他們會考慮將它們寫在所有地方。
另外需要注意的是,不要從所有倉庫中的經典CRUD,FindAll等開始。我看過很多類似這樣的存儲庫,然後我問這個問題:但是我們不刪除命令,爲什麼我們要在Order
存儲庫中刪除?確保您的存儲庫反映您在對象上執行的操作。如果您只需要一個R
(出於CRUD),那麼只需創建一個Read
方法即可。如果你需要找到,然後將其添加到它。根據需要添加方法。如果你還不需要,不要編寫代碼。
爲什麼要有這麼多的倉庫,不能只有一個? –
@雷洋這是一個很好的問題。我不確定最佳實踐是什麼。我不希望我的代碼臃腫,有很多方法。 – blgrnboy
我不是專家。但我認爲你可以從實體框架中學到一些東西,對於一個數據庫只有一個dbcontext,這就夠了。 –