Generic Repository Узор в DDD с CQRS, есть ли смысл?

голоса
2

Что-то беспокоит меня о хранилище шаблона

Какова реальная цель хранилища? Я понимаю это как часть Domain.Model, то, что обеспечивает средства для выполнения команд на агрегатах и ​​что это.

Теперь, если вы используете общий базовый Repository, который обеспечивает средства для КЕД вы можете сказать, что вы домен не является универсальным, так что хранилище не является универсальным, и я согласен, но только с одной точки зрения запросов, излучаемых и не команды.

Я упал, что общее хранилище устраняет необходимость Domain.Repositories по крайней мере, в контексте DDD, смешанный с CQRS (я знаю, что я мог бы показаться спорным, и это именно то, как я упал, а). Но если разделить ваши команды от ваших запросов, то вы будете иметь WriteRepositories, содержащий только КЕДЫ операцию. Таким образом, имея много дублей во всем месте.

Представьте себе

CustomerRepository : ICustomerRepository
{
    void Add(CustomerAggregate agg);
    void Update(CustomerAggregate agg);
}


BookRepository : IBookRepository 
{
    void Add(BookAggregate agg);
}


SubscriptionsRepository : ISubscriptionsRepository
{
     void Add(SubscriptionAggregate agg);
     void Update(SubscriptionAggregate agg);
     void Delete(SubscriptionAggregate agg);
}

...... еще 5 РЕПО

Таким образом, делает общий репозиторий имеет смысл в контексте DDD, используя CQRS шаблон, где вы Command.Stack + Query.Stack?, И если да, то это устранит необходимость Domain.Repositories (команда хранилищ)?

Задан 07/11/2018 в 20:05
источник пользователем
На других языках...                            


3 ответов

голоса
3

Какова реальная цель хранилища?

Глава 6 Эванс ( синяя книга ) охватывает шаблон репозитория довольно подробно. Хранилища «обеспечивают иллюзию в коллекции памяти ....»

Репозиторный поднимает огромную нагрузку от клиента, который теперь может говорить с простым, намерению раскрывая интерфейс, а также за то, что она нуждается в терминах модели

Они отвязать приложение и дизайн домена от инерционности технологии, нескольких стратегий баз данных, или даже нескольких источников данных.

Это не часть модели предметной области, и непосредственно не поддерживает выполнение команды. Напротив, это абстракция, которая разделяет код, который понимает поведение домена (через API совокупных корней) из кода, который понимает, как выполнять поиск данных и преобразование между сохранялось представление и представление в памяти.

Я понимаю это как часть Domain.Model, то, что обеспечивает средства для выполнения команд на агрегатах и ​​что это.

На самом деле, нет? Эти агрегаты корни являются частью модели предметной области, как и заводы, которые знают, как собрать их.

Но хранилища не являются действительно частью модели домена; модель домена не использует хранилища на всех; слой приложение потребляет их, уровень инфраструктуры обеспечивает реализацию.

Так же общий репозиторий имеет смысл в контексте DDD, используя CQRS шаблон

Ну, парень , который популяризировал шаблон CQRS не был большим поклонником общих интерфейсов репозитория .

Ответил 08/11/2018 в 03:07
источник пользователем

голоса
1

Вы бы использовать общий репозиторий, если у вас есть проблемы, которые бы извлечь из этого пользу ... в противном случае не использовать общий репозиторий ... можно также определить общий базовый репозиторий и ваши другие хранилища наследуют общие функциональные возможности из нее:

public class RepositoryBase<TEntity> : IRepositoryBase<TEntity>
       where TEntity : class
{
    // generic add logic
    public virtual void Add(TEntity entity)
    {
        DbSet.Add(entity);
        Context.SaveChanges();
    }

    // generic update logic
    public virtual void Update(TEntity entity)
    {
        DbSet.Attach(entity);
        Context.Entry(entity).State = EntityState.Modified;
    }
}

Теперь в ваших дочерних хранилищах, вы можете переопределить общее определение ... например , здесь, я хочу , чтобы определить хранилище для одного из моих совокупных корней, и я хочу, чтобы переопределить Addлогику ... и наследуйте выходящую Updateлогику:

public class MyAggRootRepository<TEntity> : RepositoryBase<MyAggRoot>,
    IMyAggRootRepository<MyAggRoot>
{
    public override void Add(TEntity MyAggRoot)
    {
        if (MyAggRoot.Id > 0 )
        {
            throw new Exception("Invalid request, Id > 0 means model is already added.");
        }

        DbSet.Add(MyAggRoot);
        Context.SaveChanges();
    }

    // happy with the inherited Update logic
}

Опять же, выбор общего хранилища о характере вашей проблемы ...

Ответил 07/11/2018 в 22:08
источник пользователем

голоса
0

Я не думаю, что CQRS обязательно иметь реальное влияние на проектирование хранилищ. Вы по-прежнему необходимо будет сохраняться / получить ваши агрегаты.

Однако при использовании EVENT-Sourcing изображения несколько меняется как хранилище событий будет выступать в качестве хранилища для абсолютно всех агрегатов.

Ответил 08/11/2018 в 04:16
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more