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

本文关键字:服务 存储 Onion 为什么 | 更新日期: 2024-10-22 13:32:58

我正在深入研究如何构建项目,因此偶然发现了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. 你对免费项目/github项目有什么建议吗?我可以下载这些项目来学习或进一步研究洋葱架构?我对例子理解得更好

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

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

1。存储库与服务:

您可能想阅读关于存储库和服务之间区别的答案,和/或Martin Fowlers服务层定义。简言之,存储库处理数据持久性,而服务为业务逻辑提供面向客户端的API。

在给定的小例子中,好处可能不清楚,但想象一下UserService有其他方法,如lockUser(User user)joinGroup(User user, Group group)UserService然后使用任何IUserRepository实现来实际持久化业务逻辑。

2.基础设施问题

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

3.示例

我知道的一组例子(用*标记)和我刚刚发现的一些例子:

  • DD样品*
  • Sylius*(实际上是一个真正的应用程序。调查组件文件夹。)
  • CodeCamp服务器
  • onionarchitecturemcv