
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.
问题可能是我应该将所有IRepository移到IServiceRepository.并且在所有控制器中仅嵌入IServiceRepository并从IServiceRepository访问IRepository吗?对我而言,此实现看起来更加清晰,因为只有IServiceRepository会注入到控制器中.但是要访问例如一个Repositorie< User>.来自ServiceRepository的服务将需要在ServiceRepository中构建并注入所有其他存储库,因此可能会减慢整个应用程序的速度.你怎么看?
要点
建立和注入存储库几乎不需要时间.我假设您的存储库在创建时不会打开任何连接,所以不要为微优化而烦恼,只需使其工作即可:)
您可以合并您的接口,只要结果接口很小(例如,不超过10个左右的方法),有重点并且有明确的目的.
旁注
存储库模式有什么需求?您是否允许(或在最近的未来计划中)在数据库之间轻松切换?在大多数情况下,存储库是一个严重的过度杀伤和维护问题.
考虑这段代码
public interface IServiceRepository
{
User GetUser(int id);
User GetUser(string email);
User GetUser(string email, byte[] password);
//SkipCode
}
它告诉我什么?好吧,从通用名称来看,我无法理解该接口的作用,就像服务的服务,抽象而不是抽象.但是从方法定义中,我看到它对用户起到了一定作用.
为什么要显式使用IUnitOfWork?您所使用的数据提供商尚未实现该功能吗?
除了直接使用ORM而不是所有这些体系结构(当然,如果可能的话),这是易于执行和维护,可靠且快速的.
转载注明原文:c#-IServiceRepository中的存储库模式IRepository - 乐贴网