Репозитории в DDD

Обсуждаем, как правильно строить приложения
Ответить
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Репозитории в DDD

Сообщение BrusSENS »

Друзья, вникаю потихоньку в DDD. Так вот после прочтения тем в данном разделе появился небольшой вопрос.
В одной теме видел пример репозитория, в котором происходит выборка из БД.
Так вот, насколько я понял, репозиторий не должен в принципе ничего знать о том, какое хранилище используется.
Посему пришёл к таким мыслям, пример ниже:
Есть у нас репозиторий PostRepository, он у нас находится в доменном слое

Код: Выделить всё

namespace Domain\Reposiroties;
use Domain\Condition;

class PostRepository implements RepositoryInterface
{
    protected $storage;
    public function __construct(StorageInterface $storage)
    {
    	$this->storage = $storage;
    }
    public function get(Condition $condition)
    {
        return $this->storage->find($condition);
    }
    ...
}
И для работы уже с БД в инфраструктурном слое добавляем объект, который будет работать с нужным местом хранения

Код: Выделить всё

namespace Infrastructure\Storages\Post
class MySQLStorage implements StorageInterface
{
    ...
    public function find(Condition $condition)
    {
        //Производим уже тут выборку
    }
    public function insert()
    {
        // Производим вставку
    }
    ...
}
Верно ли я понимаю реализацию репозиториев? И, как я понимаю, Condition у нас относится так же к доменному слою, а не к инфраструктуре?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Репозитории в DDD

Сообщение ElisDN »

BrusSENS писал(а): 2017.01.30, 04:33 Так вот, насколько я понял, репозиторий не должен в принципе ничего знать о том, какое хранилище используется.
Неверно. Репозиторий - это и есть хранилище (repository, storage). Реализация должна всё знать, а интерфейс не должен.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Репозитории в DDD

Сообщение zelenin »

BrusSENS писал(а): 2017.01.30, 04:33Так вот, насколько я понял, репозиторий не должен в принципе ничего знать о том, какое хранилище используется.
домен не должен знать какое хранилище используется. Поэтому в качестве хранилища у нас интерфейс репозитория с все-равно-какой реализацией.
BrusSENS писал(а): 2017.01.30, 04:33 Посему пришёл к таким мыслям, пример ниже:
Есть у нас репозиторий PostRepository, он у нас находится в доменном слое

Код: Выделить всё

namespace Domain\Reposiroties;
use Domain\Condition;

class PostRepository implements RepositoryInterface
{
    protected $storage;
    public function __construct(StorageInterface $storage)
    {
    	$this->storage = $storage;
    }
    public function get(Condition $condition)
    {
        return $this->storage->find($condition);
    }
    ...
}
И для работы уже с БД в инфраструктурном слое добавляем объект, который будет работать с нужным местом хранения

Код: Выделить всё

namespace Infrastructure\Storages\Post
class MySQLStorage implements StorageInterface
{
    ...
    public function find(Condition $condition)
    {
        //Производим уже тут выборку
    }
    public function insert()
    {
        // Производим вставку
    }
    ...
}
Верно ли я понимаю реализацию репозиториев? И, как я понимаю, Condition у нас относится так же к доменному слою, а не к инфраструктуре?
в целом код рабочий и в нем нет ничего неправильного, кроме логики - мы выделили из репозитория его storage-составляющую и разбили репозиторий на две части. И какая теперь задача у репозитория? быть прослойкой? вообще-то теперь ваш репозиторий - это прослойка, а MysqlStorage - репозиторий)
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Репозитории в DDD

Сообщение BrusSENS »

ElisDN писал(а): 2017.01.30, 06:13 Реализация должна всё знать, а интерфейс не должен.
Ага, значит на доменном слое мы реализуем репозитории посредством интерфейсов.
zelenin писал(а): 2017.01.30, 08:56 вообще-то теперь ваш репозиторий - это прослойка, а MysqlStorage - репозиторий)
Спасибо, понял.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Репозитории в DDD

Сообщение ElisDN »

BrusSENS писал(а): 2017.01.30, 14:51 Ага, значит на доменном слое мы реализуем репозитории посредством интерфейсов.
В ядре (домене) интерфейс:

Код: Выделить всё

namespace Domain\Repository;

interface PostRepositoryInterface
{
    ...
}
В обвязке (инфраструктуре) все реализации:

Код: Выделить всё

namespace Infrastructure\Repository;

class SqlPostRepository implements PostRepositoryInterface
{

}
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Репозитории в DDD

Сообщение BrusSENS »

ElisDN писал(а): 2017.01.30, 15:15 В ядре (домене) интерфейс:

Код: Выделить всё

namespace Domain\Repository;

interface PostRepositoryInterface
{
    ...
}
В обвязке (инфраструктуре) все реализации:

Код: Выделить всё

namespace Infrastructure\Repository;

class SqlPostRepository implements PostRepositoryInterface
{

}
Да, я именно об этом.

Ещё вопрос возник, не столько про репозитории, а больше о DDD в общем.
Насколько оправдано использовать наследование интерфейсов, ведь php нам позволяет делать это, например

Код: Выделить всё

interface RepositoryInterface
{
}
interface PostRepositoryInterface extends RepositoryInterface
{
}
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Репозитории в DDD

Сообщение zelenin »

BrusSENS писал(а): 2017.01.30, 15:47Насколько оправдано использовать наследование интерфейсов, ведь php нам позволяет делать это, например

Код: Выделить всё

interface RepositoryInterface
{
}
interface PostRepositoryInterface extends RepositoryInterface
{
}
смотря какие критерии оправданности. если код требует, то почему нет. но что за ситуация, которая требует наследовать PostRepositoryInterface от RepositoryInterface? если просто для выстраивания дерева наследования (чтобы все репозитории зачем-то наследовали один репозиторий), то это не нужно. Если же для тайп хинтинга где-то, то можно и наследовать (но опять же, может не нужен такой общий тайп хинтинг?).
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Репозитории в DDD

Сообщение BrusSENS »

zelenin писал(а): 2017.01.30, 15:54 смотря какие критерии оправданности. если код требует, то почему нет. но что за ситуация, которая требует наследовать PostRepositoryInterface от RepositoryInterface? если просто для выстраивания дерева наследования (чтобы все репозитории зачем-то наследовали один репозиторий), то это не нужно. Если же для тайп хинтинга где-то, то можно и наследовать (но опять же, может не нужен такой общий тайп хинтинг?).
Именно для тайп хинтинга. Это вопрос скорее просто филосовский, касаемый эстетики. Сам стараюсь не делать наследование там, где это не нужно, но порой бывают вынужденные действия, посему и решил поинтересоваться. Вопрос не только про интерфейсы репозиториев, а всем интерфейсов доменного слоя)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Репозитории в DDD

Сообщение zelenin »

наследовать можно, если это оправданно. а где вы собрались тайп хинтить репозиторий (в моих проектах негде)?
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Репозитории в DDD

Сообщение BrusSENS »

zelenin писал(а): 2017.01.30, 16:12 наследовать можно, если это оправданно. а где вы собрались тайп хинтить репозиторий (в моих проектах негде)?
Яж говорю, это вопрос не именно про репозитории, а про DDD в целом) Да и вопрос чисто филосовский, так то ни где)
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Ответить