Доменный Управляемый Дизайн и роль класса фабрики

Я узнал, как решить мою проблему, добавив эту строку кода в мой GridView:

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:SecurityDBConnectionString2 %>" SelectCommand="SELECT [SempID], [EmpName], [PDNo], [Position], [DateHired], [ContactNo], [Email], [EmergencyContactNo], [DateQuitTerminated], [ContactPerson], [Remarks], [Status] FROM [Personnel] WHERE ([Status] = @Status)">
                    <SelectParameters>
                        <asp:Parameter DefaultValue="1" Name="Status" Type="Int32" />
                    </SelectParameters>
                </asp:SqlDataSource>
47
задан Elnur Abdurrakhimov 12 October 2014 в 22:31
поделиться

4 ответа

, Но то, что не ясно мне, - то, где фабрика "слой" находится с архитектурой DDD? Фабрика должна звонить непосредственно в репозиторий для получения его данных или сервисной библиотеки?

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

Как правило, существует по крайней мере три источника данных, которые используются в качестве входа в фабрику для конструкции объекта области: вход от UI, результатов запросов от персистентности и доменно-значимых запросов. Таким образом для ответа на конкретный вопрос репозиторий использовал бы фабрику.

Вот пример. Я использую шаблон Разработчика Holub здесь. Редактирование : игнорируйте использование этого шаблона. Я начал понимать, что это не смешивается слишком хорошо с фабриками DDD .

// domain layer
class Order
{
    private Integer ID;
    private Customer owner;
    private List<Product> ordered;

    // can't be null, needs complicated rules to initialize
    private Product featured; 

    // can't be null, needs complicated rules to initialize, not part of Order aggregate
    private Itinerary schedule; 

    void importFrom(Importer importer) { ... }

    void exportTo(Exporter exporter) { ... }

    ... insert business logic methods here ...

    interface Importer
    {
        Integer importID();
        Customer importOwner();
        Product importOrdered();
    }

    interface Exporter
    {
        void exportID(Integer id);
        void exportOwner(Customer owner);
        void exportOrdered(Product ordered);
    }
}

// domain layer
interface OrderEntryScreenExport { ... }

// UI
class UIScreen
{
    public UIScreen(OrderEntryDTO dto) { ... }
}

// App Layer
class OrderEntryDTO implements OrderEntryScreenExport { ... }

Вот то, на что мог бы быть похожим OrderFactory:

interface OrderFactory
{
    Order createWith(Customer owner, Product ordered);
    Order createFrom(OrderEntryScreenExport to);
    Order createFrom(List<String> resultSets);
}

логика для представляемого продукта и поколения Маршрута входит в OrderFactory.

Теперь вот то, как фабрика могла бы использоваться в каждом экземпляре.

В OrderRepository:

public List<Order> findAllMatching(Criteria someCriteria)
{
    ResultSet rcds = this.db.execFindOrdersQueryWith(someCriteria.toString());
    List<List<String>> results = convertToStringList(rcds);

    List<Order> returnList = new ArrayList<Order>();

    for(List<String> row : results)
        returnList.add(this.orderFactory.createFrom(row));

    return returnList;
}

На Вашем прикладном уровне:

public void submitOrder(OrderEntryDTO dto)
{
    Order toBeSubmitted = this.orderFactory.createFrom(dto);

    this.orderRepo.add(toBeSubmitted);

    // do other stuff, raise events, etc
}

На Вашем доменном слое, модульный тест, возможно:

Customer carl = customerRepo.findByName("Carl");
List<Product> weapons = productRepo.findAllByName("Ruger P-95 9mm");
Order weaponsForCarl = orderFactory.createWith(carl, weapons);

weaponsForCarl.place();

assertTrue(weaponsForCarl.isPlaced());
assertTrue(weaponsForCarl.hasSpecialShippingNeeds());

, Где делает фабрику, вписывается в следующую платформу: UI> Приложение> Domain> Сервис> Данные

Domain.

кроме того, потому что фабрика является единственным местом, допускал создание объекта would'nt, Вы получаете циклические ссылки, если Вы хотели создать свои объекты в Ваших данных и уровнях служб?

В моем примере, все зависимости вытекают от начала до конца. Я использовал Принцип Инверсии Зависимости (ссылка PDF) для предотвращения проблемы, о которой Вы говорите.

, Если роль класса фабрики для создания объекта затем, что имеют преимущества уровень служб?

, Когда у Вас есть логика, которая не вписывается ни в какой единственный объект области ИЛИ у Вас есть алгоритм, который включает организацию нескольких объектов области, используйте сервис. Сервис инкапсулировал бы любую логику, которая не помещается ни во что больше и делегирует к объектам области, где он действительно соответствует.

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

BTW, иерархией, которую Вы описали, должен, вероятно, быть UI> Приложение> Domain Services> Domain> Инфраструктура (Данные)

, я задал много вопросов и ценю любой ответ. Какой недостаток i'am является примером приложения, который демонстрирует, как все слои в домене управляемый дизайн-проект объединяются... Есть ли там что-нибудь?

Применение Domain Управляемый Дизайн и Шаблоны Jimmy Nilsson являются большим комплиментом Eric Evans Управляемый Доменом Дизайн . Это имеет много примеров кода, хотя я не знаю, существует ли акцент на разделение на уровни. Разделение на уровни может быть хитрым и является почти темой, отдельной от DDD.

В книге Evans, существует очень небольшой пример разделения на уровни, Вы могли бы хотеть проверить. Разделение на уровни является шаблоном предприятия, и Martin Fowler записал Шаблоны Архитектуры приложений для предприятия , который Вы могли бы найти полезным также.

58
ответ дан moffdub 26 November 2019 в 19:42
поделиться

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

я использую фабрику когда:

  • уровень Some должен создать объект с некоторой регулярностью. и
  • Только, что слой знает, когда создать его, или с тем, что удовлетворение требованиям заказчика и
  • Только некоторый другой слой знает точно, что создать.
6
ответ дан SingleNegationElimination 26 November 2019 в 19:42
поделиться

Парни DDD и я могли бы спорить об этом, но в основном идея того класса "фабрики" состоит в том, чтобы выпустить объекты области. объекты области затем получают доступ к данным и становятся частью "модели" домена, с которым Вы работаете.

Приложение содержит UI и т.д., это не иерархия наследования.

Быть осторожным с тем "видом" оператора; много людей думает это, потому что они наследование использования CAN, они ДОЛЖНЫ использовать наследование. Агрегирование ("содержит" или, "имеет" в противоположность, ""), часто лучшая ставка.

Обновление

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

3
ответ дан Charlie Martin 26 November 2019 в 19:42
поделиться

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

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

, Где делает фабрику, вписывается в следующую платформу: UI> Приложение> Домен> Сервис> Данные

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

UI> Приложение> Домен

В Домене, у Вас затем есть несколько типов объектов, и я установил правила об отношениях между ними:

  • Фабрики должны быть переданы все, что они должны сделать свою работу, у меня таким образом не было бы их обращающийся к другим сервисам или репозиториям в большинстве случаев.
  • В большинстве случаев объекты не должны связываться с репозиториями, вместо этого сервисы (или другие верхние уровни) должны быть ответственны за эту работу.
  • Объекты не должны обслуживания вызовов, сервисы находятся сверху объектов/спецификаций объектов/значения и координируют их как соответствующих.
  • Сервисы в домене там для координирования, они не содержат значительный домен/настроение деловых кругов.

, Если роль класса фабрики для создания объекта затем, что имеют преимущества уровень служб?

Eric объясняет это вполне хорошо в книге, таким образом, я обратился бы к ней, но в конечном счете ее великое, если у Вас есть перекрестное совокупное поведение или поведение, которое не соответствует хорошо одному агрегату (например, пример учетной записи в книге).

2
ответ дан Colin Jack 26 November 2019 в 19:42
поделиться
Другие вопросы по тегам:

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