Pull to refresh
58
0
Денис Пешехонов @Enfriz

Фулстек разработчик: Vuejs, .NET

Send message

Очень помогает в этом подходе то, что API отдельных сущностей может быть более свободным, но закрытым для использования вне домена. Грубо говоря, часто в энтерпрайзе кейсы типа: "отправить письмо можно только тогда, когда к нему приложен документ в статусе Согласовано". Тогда собираем агрегат из письма и документа, в самом письме метод отправки делаем internal (в джаве это package private, вроде как), а публичный метод отправки остается только у агрегата.

Интересно, что мы невольно пришли у себя на проекте к такой же архитектуре, только двигаясь из классического DDD. Мы объявляем агрегат (но это агрегат не в терминологии Эванса, а как раз комбинация сущностей, что-то вроде вашего AssignData), собираем его за один запрос целиком в слое инфраструктуры, а сам он при этом выполняет свою бизнес-логику независимо от IO. Широко используется сокрытие в рамках одной сборки (модификатор internalв C#, на котором мы пишем), чтобы слою приложения вообще нельзя было сломать логику.

В вашем случае, например, в примере с Barcoder слой приложения может не проверить единственность одной из коробок, и тогда Domain-слой сработает неправильно. Как мы делали мы. Вообще, паковать одну коробку в несколько и несколько в одну выглядит разными бизнес-операциями. Но если нужно в одной, то:

Domain:

public class BoxesAggregate
{
  public IReadOnlyList<Box> Boxes { get; private set; }
  public IReadOnlyList<OsgBox> OsgBoxes { get; private set; }

  public BoxesAggregate(List<Box> boxes, List<OsgBox> osgBoxes) {
    if (boxes == null || osgBoxes == null || (boxes.Count > 1 && osgBoxes.Count > 1))
    {
      throw new Exception("Перепаковать можно только одну во много или наоборот");
    }

    Boxes = boxes.AsReadOnly();
    OsgBoxes = osgBoxes.AsReadOnly();
  }

  public void Repack()
  {
    if (boxes.Count == 1)
    {
      // код перепаковки 1
    } 
    else 
    {
      // код перепаковки 2
    }
  }

  public (List<BoxId>, List<OsgBoxId>) GetIds()
  {
     // возвращаем идентификаторы коробок для связывания в слое приложения 
  }
}

Application:

public interface IAggregateRepo
{
  public BoxesAggregate BuildFor(List<BoxId> boxIds, List<OsgBoxId> osgBoxIds);
}

public class RepackBoxesAppService(
  IAggregateRepo agRepo,
  IBoxRepo boxRepo,
  IOsgBoxRepo osgBoxRepo,
  ILinkRepo linkRepo
)
{  
  public void Handle(RepackBoxesRequest request)
  {
    // разумеется всё это одна транзакция, и никакие данные не сохранятся частично
    BoxesAggregate aggregate = agRepo.BuildFor(request.BoxIds, request.OsgBoxIds);
    
    aggregate.Repack();

    boxRepo.SaveChanges(aggregate.Boxes);
    osgBoxRepo.SaveChanges(aggregate.OsgBoxes);
    linkRepo.UpdateLinks(aggregate.GetIds());
  }
}

Infrastructure:

public class AggregateRepo : IAggregateRepo
{
  // реализация сборки агрегата путём запроса сразу всех коробок и коробов,
  // и затем вызова конструктора BoxesAggregate
}

Таким образом, почти никакие манипуляции из слоя приложения не сломают данные и не смогут обойти ограничения в бизнес-логике.

Удивительно, конечно, что он отсылает к истории, когда Финляндия буквально воевала на стороне фашистов, и это как бы не то, что считается чем-то хорошим в наши дни.

Ну, честно говоря, фигня. 600к не деньгами, а на облако, причём с ограничением в год. Я трачу на облако в год тысяч 30 максимум, и на этом серваке живут все мои проекты. То есть по сути приз это эквивалент 30к рублей.

Рабочий ноут != корпоративная лицензия всё-таки. Не на любой рабочий ноутбук запрещают ставить личный софт в личных целях. Но у меня в любом случае на личном всё установлено.

именно европейцам, а не американцам, пришлось спешно искать замену дешёвым российским энергоносителям

Ой, а как так получилось?

Скопировали только IDE для джавы. Что делать с Rider, WebStorm, RustRover итд?

У меня личная лицензия купленная мною для личных целей. В статье не сказано, что блокированы именно корпоративные лицензии.

Тоже хотел написать. Райдер особо ничем не заменить, даже решарпер поверх студии работает куда хуже.

Miro разослали клиентам из России письмо о предстоящем отключении, а через несколько дней разослали повторное с содержанием типа: "Мы почитали внимательно законы, и выяснили, что можем вас не отключать, пользуйтесь дальше".

Люди изнутри говорили, что действующим сотрудникам настоятельно не рекомендуют ездить в отпуск в РФ.

Как раз пользователи айфонов больше всего должны радоваться возможности платить устройством, а не клеить на телефон за 200к колхозный стикер )

Там же облако для синхронизации платное (не путать с публикацией). Как мне удобно работать в Обсидиане с двух ноутов, десктопа и телефона?

1
23 ...

Information

Rating
4,288-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Works in
Date of birth
Registered
Activity