DDD - Строительные хранилища - PullRequest
4 голосов
/ 04 ноября 2010

Если у меня есть репозиторий, предназначенный для получения моего совокупного корня (как определено Eric Evans DDD), например объект Order (корневой агрегат), у которого объекты OrderLine будут дочерними.

В некоторых случаях я просто хочу получить объект верхнего уровня, т.е. Order без OrderLines, а в других случаях я бы хотел вернуть немного больше, может быть, вниз на 2 уровня и т. Д. Т.е. Order и связанные OrderLines.

Сценарий Order / OrderLine - простой пример, но что, если мой Aggregate Root был глубже этого, возможно, спустившись на 3 или 4 уровня.

Каков наилучший / приемлемый способ встраивания этого в репозиторий (с энергичной загрузкой) ??

Ответы [ 3 ]

2 голосов
/ 05 ноября 2010

Уди Дахан рассказал о намеренных интерфейсах на TechEd 2008. В своей презентации он рассказал о том, как преднамеренно извлекать сущности из хранилища. Вы можете посмотреть его презентацию или слайды .

Идея заключается в том, что вы выбираете сущности в зависимости от того, чего вы хотите достичь. Например, если вы хотите выполнить заказ, вы создаете интерфейс ICompleteOrder с методом Complete и привязываете к нему FetchingStrategy. Затем вы можете использовать что-то вроде Repository.Find<ICompleteOrder>(orderIdentity) и получить эту сущность, как вы указали в FetchingStrategy.

1 голос
/ 04 ноября 2010

Одна модель не может быть подходящей для отчетов, поиска и транзакций (бизнес-единица работы). Модель вашего домена должна в основном фокусироваться на транзакционном поведении бизнес-единицы работы (а также на некоторых запросах ... скажем (гипотетически, например) Customer.allAccounts ()).

Я предлагаю вам взглянуть на расширенный мыслительный процесс по DDD, называемый CQRS http://gojko.net/2010/06/11/evolution-of-ddd-cqrs-and-event-sourcing/

0 голосов
/ 04 ноября 2010

Не совсем уверен, что вы подразумеваете под Aggregate Root.Насколько я знаю, шаблон репозитория обычно работает с кластером объектов, которые являются частью вашей доменной модели, в DDD это обычно называется aggregates .То, как вы получаете доступ к своим объектам из репозитория, зависит от того, какой уровень доступа к данным вы используете в своем приложении.Обычно я использую NHibernate as и ORM, который управляет всеми отношениями между моими классами и таблицами базы данных, поэтому при реализации репозитория я могу использовать любые объекты, которые являются частью моего домена, и обращаться к ним по мере необходимости.

Здесьпример хранилища, в котором используются разные объекты:

public interface IStoryRepository : IRepository<Story>
{
   List<Image> GetStoryImage(int id);
   List<FacebookUser> GetFbUserById(string id);
}

public class StoryRepository : Repository<Story>, IStoryRepository
{
   public List<Image> GetStoryImage(int id)
   {
       var criteria = Session.CreateCriteria(typeof(Image))
       .Add(Restrictions.Eq("Id", id))
       .SetResultTransformer(new DistinctRootEntityResultTransformer());
        return criteria.List<Image>() as List<Image>;
    }

    public List<FacebookUser> GetFbUserById(string id)
    {
       var criteria = Session.CreateCriteria(typeof(FacebookUser))
       .Add(Restrictions.Eq("Id", id))
       .SetResultTransformer(new DistinctRootEntityResultTransformer());

        return criteria.List<FacebookUser>() as List<FacebookUser>;
     }
}
...