我已经实现了存储库模式并且效果很好。
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)了 IRepositories
和 IServiceRepository
在这种情况下。有时我只注入(inject) IRepositories
或 IServiceRepository
视需求而定。
问题是也许我应该移动所有 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/