为什么在 Onion Architecture 中公开服务而不是存储库?

Why expose service instead of repository in Onion Architecture?

我正在研究如何构建项目,所以我偶然发现了 Onion Architecture。据我了解,它更像是一种以领域为中心的焦点架构,而不是数据库驱动类型。

我正在寻找一些 github 项目来研究和了解有关架构的更多信息,所以我找到了这个 https://github.com/chetanvihite/OnionArchitecture.Sample

我很难理解:

namespace Domain.Interfaces
{
    public interface IUserRepository
    {
        IEnumerable<User> GetUsers();
    }
}

namespace Services.Interfaces
{
    public interface IUserService
    {
        IEnumerable<User> GetUsers();
    }
}

namespace Services
{
    public class UserService : IUserService
    {
        private readonly IUserRepository _repository;

        public UserService(IUserRepository repository)
        {
            _repository = repository;
        }

        public IEnumerable<User> GetUsers()
        {
            return _repository.GetUsers();
        }
    }
}

他的使用方式是通过构造函数注入。

private readonly IUserService _service;

public HomeController(IUserService service)
{
  _service = service;
}
  1. 您是否总是将 IUserService 等服务暴露给使用它的应用程序?但我注意到,IUserRepositoryIUserService?

  2. 具有相同的方法
  3. 如果你说基础设施问题,它是指还是涉及数据库?或者不一定?如果不是,基础设施问题的例子有哪些?

  4. 你有什么免费的 projects/github 项目推荐吗?我可以下载这些项目来学习或进一步研究洋葱架构?我在示例中理解得更好

P.S。 当我学习洋葱架构时,它总是(如果不是总是)至少提到 DDD。所以我想,我也会学习 DDD :)

1.存储库与服务:

您可能想阅读有关 difference between repositories and services, and/or Martin Fowlers service layer 定义的答案。简而言之,存储库处理数据持久性,而服务为业务逻辑提供面向客户端的 API。

在给定的小示例中,好处可能并不明显,但可以想象 UserService 有其他方法,例如 lockUser(User user)joinGroup(User user, Group group)UserService 然后使用 any IUserRepository 实现来实际持久化业务逻辑。

2。基础设施问题

基础设施层通常与外部 资源对话,例如文件系统、数据库或网络服务。在您的示例中,IUserRepository 是基础设施层的一部分。

3。例子

我知道的例子集(标有*)和一些我刚刚找到的例子: