+-
c#-IServiceRepository中的存储库模式IRepository
我已经实现了存储库模式,并且效果很好.

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 - 乐贴网