我已经实现了存储库模式,并且效果很好。

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;
    }
}


如您所见,在这种情况下,我注入了IRepositoriesIServiceRepository。有时我会根据需要只注入IRepositoriesIServiceRepository

问题可能是我应该将所有IRepositories移到IServiceRepository中。并且在所有控制器中仅嵌入IServiceRepository并从IRepositories访问IServiceRepository吗?对我来说,这种实现看起来更清晰,因为只有IServiceRepository会被注入到控制器中。但是要从Repositorie<User>访问一个ServiceRepository,需要在ServiceRepository中构建和注入所有其他存储库,因此这可能会使整个应用程序变慢。你怎么看?

最佳答案

我的回答是有争议的,所以请忍受我:)

要点
建立和注入存储库几乎不需要时间。我假设您的存储库在创建时不会打开任何连接,所以不要为微优化而烦恼,只需使其工作即可:)

您可以合并您的接口,只要结果接口很小(例如不超过10个左右的方法),有重点并且有明确的目的。


旁注
存储库模式有什么需求?您是否允许(或在最近的未来计划中)在数据库之间轻松切换?在大多数情况下,存储库是一个严重的过度杀伤和维护问题。

考虑这段代码

public interface IServiceRepository
{
    User GetUser(int id);
    User GetUser(string email);
    User GetUser(string email, byte[] password);
    //SkipCode
}


它告诉我什么?好吧,从通用名称来看,我无法理解该接口的作用,就像服务的服务,抽象而不是抽象。但是从方法定义中,我看到它对User起作用。

为什么要显式使用IUnitOfWork?您所使用的数据提供商尚未实现该功能吗?

代替所有这些架构(当然,如果可能的话),直接使用ORM,这是易于执行和维护,可靠且快速的。

10-08 11:55