Какие методы должны войти в мой класс фабрики DDD?

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

select b.*
from books b
order by (
  select max(publishdate)
  from books
  where author = b.author
) desc, b.publishdate desc
12
задан 4 March 2009 в 15:06
поделиться

6 ответов

Будьте осторожны, есть две причины для создания нового объекта: Создание it и регидратируя его из базы данных.

Первый случай обрабатывается фабрикой. Вы можете предоставить несколько методов для создания объекта на фабрике. Методы фабрики должны возвращать действительные объекты, так что вы можете передавать параметры этим методам для предоставления необходимой информации.

Метод фабрики также может выбирать фактический тип для создания экземпляра на основе параметров.

Не следует смешивать это с регидратацией из база данных. Этот тип создания экземпляров должен принимать значения из datarow и создавать экземпляр объекта с ним. Обычно я называю это построителем данных вместо фабрики .

Основное отличие состоит в том, что фабрика будет создавать объект с новым идентификатором, в то время как создатель данных будет создавать объект с уже существующая личность.

6
ответ дан 2 December 2019 в 07:22
поделиться

То, что должно войти в Вашу фабрику, Создают метод, - то, что необходимо для помещения бренда, шлепающего новый объект в ДОПУСТИМОЕ состояние.

Теперь, для некоторых объектов, который означает, Вы не сделаете ничего кроме этого:

public Product Create()
{
   return new Product();
}

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

И это - часть преимущества Фабрики. У Вас теперь есть одно и только одно место, где та специальная логика находится, и только одно место, где новый объект создается.

2
ответ дан 2 December 2019 в 07:22
поделиться

Я должен выполнять прямой вызов в репозиторий из фабрики?

Нет, не используйте фабрику, когда Ваш материал получения, используйте фабрику только при создании его впервые.

Как я должен справиться с созданием объекта когда retriving данные из базы данных?

Передайте те данные в фабрику, если это требуется для начального создания объекта.

Что я должен сделать этот класс завершенным, что другие методы я должен иметь?

Много фабрик даже не являются отдельными классами, они - просто методы, которые обеспечивают создание объекта. Вы могли свернуть метод фабрики в другой класс, если бы Вы чувствовали, что он просто собирался вызвать конструктора без параметров.

Я должен использовать этот класс для создания объекта продукта из домена и репозитория от права?

Репозиторий для получения (в некотором смысле создающий) существующие объекты, фабрика впервые, Вы создаете объект.

Первоначально много фабрик не сделают многого кроме вызова конструктор. Но после того как Вы начинаете осуществлять рефакторинг и/или создавать большие иерархии объектов, фабрики становятся более релевантными.

Объяснение и пример:

Например, в проекте я продолжаю работать, у меня есть базовый класс процессора Excel и много подклассов, реализовывая тот базовый класс. Я использую фабрику, чтобы получить надлежащую и затем назвать методы на нем, неосведомленными, из которых был возвращен подкласс. (Отметьте: Я изменил некоторые имена переменной и разрушил/изменил много кода),

Базовый класс процессора:

public abstract class ExcelProcessor
{
      public abstract Result Process(string ExcelFile);
}

Один из подклассов Процессора:

public class CompanyAExcelProcessor : ExcelProcessor
{
     public override Result Process(string ExcelFile)
     {
      //cool stuff
     }
}

Фабрика:

 public static ExcelProcessor CreateExcelProcessor(int CompanyId, int CurrentUserId)
 {
      CompanyEnum company = GetCompanyEnum(CompanyId);
      switch (company)
      {
           case CompanyEnum.CompanyA:
                return new CompanyAExcelProcessor();
           case CompanyEnum.CompanyB:
                return new CompanyBExcelProcessor();
           case CompanyEnum.CompanyC:
                return new CompanyCExcelProcessor(CurrentUserId);
           //etc...
      }
 }

Использование:

ExcelProcessor processor = CreateExcelProcessor(12, 34);
processor.Process();
12
ответ дан 2 December 2019 в 07:22
поделиться

@ThinkBeforeCoding - в примере @ m4bwav фабрика получает действительный идентификатор из вспомогательного метода, но не создает новая запись в слое постоянства в любом месте. Однако, если я использую столбец идентификаторов, автоматически сгенерированный базой данных, в качестве идентификаторов, создается впечатление, что фабрике пришлось бы обращаться к хранилищу, чтобы выполнить первоначальное создание объекта. Можете ли вы прокомментировать, какой метод является «правильным»?

0
ответ дан 2 December 2019 в 07:22
поделиться

В примере, данном выше, я немного неясен на различии между Вашей фабрикой и репозиторием. Интересно, не должны ли Вы просто добавлять CreateProduct как метод в репозиторий и использование DI для продвижения репозитория в код, для которого нужен он? Если фабрика ничего не делает и т.д...

Или если Вы просто хотите, чтобы это действовало как глобально зарегистрированный репозиторий, возможно, что-то как:

public static IFooRepository Default {get;private set;}
public static void SetRepository(IFooRepository repository) {
    Default = repository;
}

(в моем уме это кажется более ясным для разделения "набора" в этом случае, но Вы не должны соглашаться),

и сделайте, чтобы вызывающие стороны использовали var product = YourFactory.Default.CreateProduct(); и т.д.

0
ответ дан 2 December 2019 в 07:22
поделиться

Я лично использовал бы фабрику при нескольких обстоятельствах:

1) Что-то в другом месте управляет, какие объекты эта фабрика возвраты (т.е. она может возвратить объекты в зависимости от обстоятельств. Например, возвратите тупиковый объект, когда я тестирую, возвратите фактическую реализацию, когда я не (это - очевидно, больше Инверсии Управления / проблема Внедрения зависимости - но если Вы не хотите добавлять контейнеры к своему проекту просто все же)).

2) У меня есть довольно сложные объекты, которые имеют контейнеры, зависимости, другое отношение и т.д., и они должны быть созданы тщательно, чтобы не создавать пустые или бессмысленные ссылки. Например, если у меня есть объект Расписания, мне, возможно, понадобится, некоторые запускают, полевой набор даты окончания - если логика для получения, выясняя их датируется, достаточно сложно, я не могу хотеть, чтобы класс вызова знал об этом и просто назвал метод фабрики по умолчанию, который создал объект расписания.

Надеюсь, это поможет.

1
ответ дан 2 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: