gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:38:22 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com