c# - IServiceRepository 中的存储库模式 IRepository<T>

标签 c# model-view-controller dependency-injection repository repository-pattern

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

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        
}

当我想从 IServiceRepository 访问某些方法时在 Controller 中我这样做

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

如你所见,我注入(inject)了 IRepositoriesIServiceRepository在这种情况下。有时我只注入(inject) IRepositoriesIServiceRepository视需求而定。

问题是也许我应该移动所有 IRepositories进入IServiceRepository .并且在所有 Controller 中只嵌入 IServiceRepository并访问 IRepositories来自 IServiceRepository ?这个实现对我来说看起来更清楚,因为只有 IServiceRepository将被注入(inject) Controller 。但是要访问例如一个 Repositorie<User>来自 ServiceRepository将需要在 ServiceRepository 中构建和注入(inject)所有其他存储库,所以它可能会减慢整个应用程序。你怎么看?

最佳答案

我的回答有争议,所以请多多包涵:)

进入正题
构建和注入(inject)存储库应该几乎没有时间。我假设您的存储库在创建时不会打开任何连接,所以不要为微优化而烦恼,只要让它工作就可以了:)

您可以合并您的界面,只要结果界面很小(比如不超过 10 个左右的方法)、重点突出且目的明确。


旁注
存储库模式需要什么?您是否允许(或在最近的 future 计划中)在数据库之间轻松切换?在大多数情况下,存储库是一个巨大的矫枉过正和维护问题。

考虑这段代码

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

它告诉我什么?好吧,从通用名称我无法理解这个接口(interface)的作用,它就像服务的服务,抽象之上的抽象。但是从方法定义来看,我看到它对 User 做了一些事情。

为什么要明确使用 IUnitOfWork?您使用的数据提供商是否尚未实现?

而不是所有这些架构(当然如果可能的话),直接使用ORM,这很容易做和维护,可靠和快速。

关于c# - IServiceRepository 中的存储库模式 IRepository<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11559499/

相关文章:

c# - 从部分 View 编辑器获取更新数据并传递给 Controller

javascript - 如果验证失败,如何停止表单提交

dependency-injection - 有没有办法使用 PostSharp 使构造函数参数在类级别可见?

c# - Dependency Injection 和具体的依赖实现

c# - 无法读取配置部分 'customErrors',因为它缺少部分声明

c# - 为什么调用不明确? 'Task.Run(Action)' 和 'Task.Run(Func<Task>)'

c# - 在 mvc 中使用复选框

c# - 忍者。将所有接口(interface)绑定(bind)到单例范围内的同一个类

c# - 文件类型的默认构建操作

c# - 如何在 C# 中解析 JsonObject