Доменный Управляемый Дизайн (Linq к SQL) - Как Вы удаляете части агрегата?

Даже в обычном Docker вы никогда не сможете обновить контейнер до более нового изображения, не удаляя и не воссоздавая его. Это также невозможно в Kubernetes: список containers в спецификации модуля «не может быть добавлен или удален ... не может быть обновлен», что означает, что вы никогда не сможете изменить изображение на существующем модуле .

В Kubernetes лучшая практика - всегда использовать явный тег версии (никогда latest или что-либо подобное, которое, как ожидается, изменится) и управлять модулями с развертываниями. Когда у вас будет новая сборка, измените спецификацию развертывания, чтобы иметь новый тег. Kubernetes заметит, что новое развертывание отличается от старого, и будет по порядку:

  1. запустить новый модуль с новым образом;
  2. дождаться проверки его работоспособности, чтобы проходить; и
  3. Удалить старый Pod.

Это приводит к обновлению без простоев.

7
задан Jim G. 4 October 2009 в 03:14
поделиться

4 ответа

Вы называете RemoveOrderLine на Порядке, которые называют связанную логику. Это не включает выполнение изменений в сохраненную версию его.

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

  • Имейте объект области, отслеживают изменения, которые включали бы отслеживание, что x должен быть удален из строк порядка. Что-то подобное отслеживанию объекта могло бы быть факторизовано также.
  • Загрузите сохраненную версию. Имейте код в репозитории, который распознает различия между сохраненной версией и версией в оперативной памяти, и выполняет изменения.
  • Загрузите сохраненную версию. Имейте код в корневом агрегате, который получает Вас различия, учитывая исходный корневой агрегат.
2
ответ дан 7 December 2019 в 14:38
поделиться

В качестве продолжения .... Я перешел на использование nhibernate (вместо ссылки на SQL), но в действительности вам не нужны репозитории для OrderLine. Если вы просто удалите OrderLine из коллекции в Order, он просто удалит OrderLine из базы данных (при условии, что вы правильно сделали отображение). Как я обмениваюсь с репозиториями в памяти, если вы хотите искать определенную строку заказа (не зная родителя заказа), вы можете написать запрос linq to nhibernate, который связывает заказ с строкой заказа, где orderlineid = значение. Таким образом, он работает при запросах из БД и из памяти. Ну что ж, поехали ...

0
ответ дан 7 December 2019 в 14:38
поделиться

Во-первых, необходимо выставлять Интерфейсы для получения ссылок на Совокупный Корень (т.е. Порядок ()). Используйте Шаблон "фабрика" для нового новый экземпляр Совокупного Корня (т.е. Порядок ()).

После этих слов методы на Вашем Совокупном Корне contros доступ к его связанным объектам - не сам. Кроме того, никогда не выставляйте составные типы как общественность на совокупных корнях (т.е. Строки () набор IList, который Вы заявили в примере). Это нарушает закон декреметра (SP ck), который говорит, что Вы не можете "Отметить точкой Обход" Ваш путь к методам, таким как Порядок. Строки. Добавьте ().

И также, Вы нарушаете правило, которое позволяет клиенту получать доступ к ссылке на внутренний объект на Совокупном Корне. Совокупные корни могут возвратить ссылку внутреннего объекта. Целый, внешнему клиенту не разрешают держать ссылку на тот объект. Т.е. Ваш "OrderLine" Вы передаете в RemoveLine (). Вы не можете позволить внешнему клиенту управлять внутренним состоянием своей модели (т.е. Порядок () и его OrderLines ()). Поэтому необходимо ожидать, что OrderLine будет новым экземпляром для реакции соответственно.

public interface IOrderRepository
{
  Order GetOrderByWhatever();
}

internal interface IOrderLineRepository
{
  OrderLines GetOrderLines();
  void RemoveOrderLine(OrderLine line);
}

public class Order
{
  private IOrderRepository orderRepository;
  private IOrderLineRepository orderLineRepository;
  internal Order()
  {
    // constructors should be not be exposed in your model.
    // Use the Factory method to construct your complex Aggregate
    // Roots.  And/or use a container factory, like Castle Windsor
    orderRepository = 
            ComponentFactory.GetInstanceOf<IOrderRepository>();
    orderLineRepository = 
            ComponentFactory.GetInstanceOf<IOrderLineRepository>();
  }
  // you are allowed to expose this Lines property within your domain.
  internal IList<OrderLines> Lines { get; set; }  
  public RemoveOrderLine(OrderLine line)
  {
    if (this.Lines.Exists(line))
    {
      orderLineRepository.RemoveOrderLine(line);
    }
  }
}

Не забывайте свою фабрику для создания новых экземпляров Порядка ():

public class OrderFactory
{
  public Order CreateComponent(Type type)
  {
    // Create your new Order.Lines() here, if need be.
    // Then, create an instance of your Order() type.
  }
}

Ваш внешний клиент действительно имеет право получить доступ к IOrderLinesRepository непосредственно через интерфейс для получения ссылки объекта значения в Совокупном Корне. Но, я пытаюсь заблокировать это путем принуждения моих ссылок все прочь методов Совокупного Корня. Так, Вы могли отметить IOrderLineRepository выше как внутренний, таким образом, он не выставляется.

Я на самом деле группа все мои Совокупные Корневые создания в несколько Фабрик. Мне не нравился подход, "Некоторые совокупные корни будут иметь фабрики для составных типов, другие не будут". Намного легче следовать за той же логикой в течение доменного моделирования. "О, таким образом, Продажи () являются совокупным корнем как Порядок (). Должна быть фабрика для него также".

Одно заключительное примечание - то, что, если имеют комбинацию, т.е. SalesOrder (), который использует две модели Продаж () и Порядок (), Вы использовали бы Сервис, чтобы создать и действовать на тот экземпляр SalesOrder () как ни один Продажи () или Порядок () Совокупные Корни, ни их репозитории или фабрики, собственное управление SalesOrder () объект.

Я высоко, настоятельно рекомендуйте эту бесплатную книгу Abel Avram и Floyd Marinescu на Доменном дизайне диска (DDD), поскольку это непосредственно отвечает на Ваши вопросы в shrot крупном шрифте на 100 страниц. Наряду с тем, как больше отделить Ваши доменные объекты в модули и такой.

Править: добавленный больше кода

1
ответ дан 7 December 2019 в 14:38
поделиться

After struggling with this exact issue, I've found the solution. After looking at what the designer generates with l2sl, I realized that the solution is in the two-way associations between order and orderline. An order has many orderlines and an orderline has a single order. The solution is to use two way associations and a mapping attribute called DeleteOnNull(which you can google for complete info). The final thing I was missing was that your entity class needs to register for Add and Remove events from the l2s entityset. In these handlers, you have to set the Order association on the order line to be null. You can see an example of this if you look at some code that the l2s designer generates.

I know this is a frustrating one, but after days of struggling with it, I've got it working.

1
ответ дан 7 December 2019 в 14:38
поделиться
Другие вопросы по тегам:

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