[英]Repository Pattern IRepository<T> inside IServiceRepository
我已經實現了存儲庫模式,它運行得很好。
public interface IServiceRepository
{
User GetUser(int id);
User GetUser(string email);
User GetUser(string email, byte[] password);
//SkipCode
}
//Service repository where I keep extended methods for database manipulation
public class ServiceRepository : IServiceRepository
{
private readonly IRepository<User> _userRepository;
private readonly IRepository<Order> _orderRepository;
private readonly IUnitOfWork _unitOfWork;
public ServiceRepository(IRepository<User> userRepository, IRepository<Order> orderRepository, IUnitOfWork unitOfWork)
{
}
//SkipImplementation
}
當我想從Controller中的IServiceRepository
訪問一些方法時,我這樣做
public class AccountController : Controller
{
private readonly IRepository<OrderDetail> _orderDetailRepository;
private readonly IRepository<UserDetail> _userDetailRepository;
private readonly IServiceRepository _serviceRepository;
public AccountController(IRepository<OrderDetail> orderDetailRepository, IRepository<UserDetail> userDetailRepository, IServiceRepository serviceRepository)
{
_orderDetailRepository = orderDetailRepository;
_userDetailRepository = userDetailRepository;
_serviceRepository = serviceRepository;
}
}
如您所見,我在此場景中注入了IRepositories
和IServiceRepository
。 有時我會根據需要僅注入IRepositories
或IServiceRepository
。
問題可能是我應該將所有IRepositories
移動到IServiceRepository
。 並且在所有控制器中只嵌入IServiceRepository
並從IServiceRepository
訪問IRepositories
? 這個實現對我來說更清楚,因為只有IServiceRepository
會被注入到控制器中。 但是要訪問例如ServiceRepository
一個Repositorie<User>
,需要在ServiceRepository
構建並注入所有其他存儲庫,因此可能會降低整個應用程序的速度。 你怎么看?
我的回答是有爭議的,所以請耐心等我:)
到了這一點
構建和注入存儲庫幾乎不需要時間。 我假設您的存儲庫在創建時不會打開任何連接,所以不要打擾微優化,只需讓它工作:)
您可以合並您的接口,只要結果接口很小(例如,方法不超過10個),專注且具有明確的目的。
考慮這段代碼
public interface IServiceRepository { User GetUser(int id); User GetUser(string email); User GetUser(string email, byte[] password); //SkipCode }
它告訴我什么? 好吧,從通用名稱我無法理解這個接口的作用,它就像服務的服務,抽象的抽象。 但是根據方法定義,我看到它對User
做了一些事情。
為什么要明確使用IUnitOfWork
? 您使用的數據提供程序尚未實現嗎?
而不是所有這些架構 (當然,如果可能的話),只需直接使用ORM,這很容易做到和維護,可靠和快速。
您的ServiceRepository似乎更接近服務層中的域服務而不是自己的存儲庫。
域服務通常協調與各種數據存儲庫的交互序列,例如從客戶存儲庫加載客戶和從訂單存儲庫加載訂單列表以呈現客戶及其所有訂單的統一視圖。 因為這樣的域服務用於在應用程序周圍創建操作邊界 - 抽象出各種數據訪問序列。
這是一個很好的方法,但我認為你遇到的問題是你沒有采取足夠的措施。 如果您決定將應用程序的操作封裝到一系列域服務中,那么Controller將無需訪問存儲庫。 另一方面,如果您決定控制器將采用該可重用性並自行訪問存儲庫,那么您的ServiceRepository類和其他類似的類基本上成為實用程序類。
我看到你有兩個選擇 - 將服務層改進到控制器不再需要存儲庫的程度:
public class AccountController
{
public AccountController(IAccountsService service)
{
_service = service;
}
public void SomeActionMethod(Foo someParams)
{
_service.SomeAction(someParams);
}
}
或調用ServiceRepository它是什么,一個用於執行固定數據訪問序列的快捷工具...
public class AccountController
{
public AccountController(ICustomerRepository customerRepo, IOrderRepository orderRep)
{
_customerRepo = customerRepo;
_orderRepo = orderRepo;
}
public void SomeActionMethod(Foo someParams)
{
var utility = new CustomerOrderBuilderUtility(_customerRepo, _orderRepo);
var customerWithOrders = utility.GetCustomerAndOrders(someParams.CustomerId);
// some domain logic...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.