4

我有一個ASP.NET MVC應用程序,我正在使用存儲庫模式以及服務特定的存儲庫。我發現我的設置開始感覺非常重複。服務層重複存儲庫層中的函數

我的層是這樣的: UserController中> UserService> UserRepository(庫然後使用實體框架)

控制器接受服務在構造爲可測性: public UserController(IUserService userService)

該服務接受存儲庫: public UserService(IUserRepository)

用戶可能能夠更新他們的商業信息,更改他們的名字,電子郵件,刪除聯繫地址等。

所以我結束了在服務這樣的事情:

public class UserService { 
    User CreateUser(....); 
    User GetUserById(int id); 
    void UpdateUser(User user); 
    void DeleteUser(User user); 
    Business CreateBusiness(...); 
    Business GetBusinessById(int businessId); 
    void UpdateBusiness(Business business); 
    void DeleteBusiness(Business business); 
    IEnumerable<Business> GetBusinessesByUserId(); 
    IEnumerable<BusinessType> GetBusinessTypes(); 
    ... 
    ... 
    ... 

在倉庫層每個函數調用的函數是這樣的:

public class UserRepository { 
    User CreateUser(....); 
    User GetUserById(int id); 
    void UpdateUser(User user); 
    void DeleteUser(User user); 
    Business CreateBusiness(...); 
    Business GetBusinessById(int businessId); 
    void UpdateBusiness(Business business); 
    void DeleteBusiness(Business business); 
    IEnumerable<Business> GetBusinessesByUserId(); 
    IEnumerable<BusinessType> GetBusinessTypes(); 
    ... 
    ... 
    ... 

任何時候,我需要做任何類型的CRUD /數據訪問操作,我發現自己正在執行以下操作:

  • 將操作添加到存儲庫的接口
  • 實現和代碼庫函數
  • 添加操作到業務層的接口
  • 實現和代碼的服務功能調用上述庫函數

這是越來越繁瑣,尤其是當有與特定服務/存儲庫相關的多個實體。在整個應用程序中乘以多個存儲庫和服務...

爲了背景,我不再使用通用存儲庫,以避免將多個存儲庫左右注入服務和/或控制器構造函數(或單個服務函數)的複雜性。

看來我違反DRY,並不斷重複自己。這是儘可能接近,或者是否有更有效的方法來做到這一點?謝謝。

+0

我也問過這樣的事情在過去,看看我的awser:http://stackoverflow.com/questions/2884011/service-layer-are - 重複我的庫 –

+0

@felipeoriani - 謝謝,我看到了,但我希望避免一個通用的存儲庫模式,由於上述原因。我想知道如果我是儘可能以最好的方式做到這一點,那麼給定服務特定的存儲庫。 – Josh

+0

閱讀這篇文章。改變了我的體系結構:http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92完成後,請回頭閱讀以下內容:http://www.cuttingedge .it/blogs/steven/pivot/entry.php?id = 91 – danludwig

回答

4

首先。服務層不應重複存儲庫功能。而不是UserService.UpdateUser功能,應該有UserService.UpdateBasicData,UserService.UpdatePassword對象字段的子集的User。你通常不應該公開服務中的ORM層對象。 User對象肯定有很多屬性,並且UpdateUser函數不應該改變它們,所以它不應該錯誤服務使用者,它可能會改變它們。

二。您仍然可以使用通用存儲庫併爲注入進行存儲庫聚合。例如:

public class UserRelatedRepositories : IUserRelatedRepositories { 
    IRepository<User> User { get; set; } 
    IRepository<Business> Business { get; set; } 
} 

然後用

UserRelatedRepositories.User.Create() 
+0

謝謝。如果我不向服務公開ORM對象,那麼在獲取用戶時服務會返回什麼?另外,如果我有一個需要連接多個表並返回一個DTO的複雜查詢,那麼這個函數是否會直接在這個更高級別的聚合存儲庫上實現(在你的例子中爲「UserRelatedRepositories」)? – Josh

+0

此外,爲了可測試性,我不會將所有通用的IRepository對象傳入我的聚合存儲庫的構造函數中,因此我的控制器的構造函數? – Josh

+0

@Josh:服務返回DTOs,所以它會返回包含用戶屬性子集的對象。對我而言,存儲庫是對象,僅用於簡單的CRUD操作,因此必須在服務中進行復雜的查詢。這就是爲什麼我的項目中的存儲庫返回'IQueryable'。爲了可測試性,聚合存儲庫必須在構造函數中使用存儲庫。 – LukLed