相关疑难解决方法(0)

PHP中的正确存储库模式设计?

前言:我正在尝试在具有关系数据库的MVC架构中使用存储库模式.

我最近开始用PHP学习TDD,并且我意识到我的数据库与我的应用程序的其余部分非常接近.我已经阅读了有关存储库和使用IoC容器将其"注入"我的控制器的内容.很酷的东西.但是现在有一些关于存储库设计的实际问题.考虑以下示例.

<?php

class DbUserRepository implements UserRepositoryInterface
{
    protected $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function findAll()
    {
    }

    public function findById($id)
    {
    }

    public function findByName($name)
    {
    }

    public function create($user)
    {
    }

    public function remove($user)
    {
    }

    public function update($user)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

问题#1:字段太多

所有这些find方法都使用select all fields(SELECT *)方法.但是,在我的应用程序中,我总是试图限制我获得的字段数量,因为这通常会增加开销并减慢速度.对于那些使用这种模式的人,你如何处理这个?

问题#2:方法太多了

虽然这个类现在看起来不错,但我知道在现实世界的应用程序中我需要更多的方法.例如:

  • findAllByNameAndStatus
  • findAllInCountry
  • findAllWithEmailAddressSet
  • findAllByAgeAndGender
  • findAllByAgeAndGenderOrderByAge
  • 等等.

如您所见,可能存在非常长的可能方法列表.然后,如果您添加上面的字段选择问题,问题就会恶化.在过去,我通常只是将所有这些逻辑放在我的控制器中:

<?php

class MyController
{
    public function users()
    {
        $users = User::select('name, email, status') …
Run Code Online (Sandbox Code Playgroud)

php database repository repository-pattern laravel

265
推荐指数
4
解决办法
6万
查看次数

存储库和服务层之间的区别

我查看了一些相关的问题,但我仍然看不到存储库和服务层之间的差异.所以考虑到这个例子,我想它应该是这样的,如果不是,请告诉我为什么?

public interface ProductRepository extends CrudRepository<Product, Long>{

    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

public interface ProductService {

    public List<Product> findAll();
    public Product findById(Long id);
    public Product save(Product product);
    public void delete(Product product);
    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}
Run Code Online (Sandbox Code Playgroud)

并且ProductService的实现将使用ProductRepository来实现这些方法.据我所知,从http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html可以自动生成存储库中方法的查询.在我的例子中,方法在存储库和服务中重复,所以请解释什么/为什么需要更改?

java service data-access-layer repository

10
推荐指数
4
解决办法
1万
查看次数

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

我正在挖掘如何构建项目,所以我偶然发现了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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

他如何使用它是通过构造函数注入.

private readonly IUserService _service;

public HomeController(IUserService service)
{
  _service = service;
}
Run Code Online (Sandbox Code Playgroud)
  1. 您是否总是将服务暴露给IUserService消费它的应用程序?但我注意到,IUserRepository有相同的方法IUserService吗?

  2. 如果您说基础设施问题,它是否意味着或涉及数据库?或者不一定?如果没有,基础设施问题的例子是什么?

  3. 您对免费项目/ github项目有什么建议吗?我可以下载这些项目以进一步学习或研究洋葱建筑吗?我对例子的了解更多 …

c# domain-driven-design onion-architecture

5
推荐指数
1
解决办法
901
查看次数