Очень помогает в этом подходе то, что 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к рублей.
Рабочий ноут != корпоративная лицензия всё-таки. Не на любой рабочий ноутбук запрещают ставить личный софт в личных целях. Но у меня в любом случае на личном всё установлено.
Miro разослали клиентам из России письмо о предстоящем отключении, а через несколько дней разослали повторное с содержанием типа: "Мы почитали внимательно законы, и выяснили, что можем вас не отключать, пользуйтесь дальше".
Очень помогает в этом подходе то, что API отдельных сущностей может быть более свободным, но закрытым для использования вне домена. Грубо говоря, часто в энтерпрайзе кейсы типа: "отправить письмо можно только тогда, когда к нему приложен документ в статусе Согласовано". Тогда собираем агрегат из письма и документа, в самом письме метод отправки делаем internal (в джаве это package private, вроде как), а публичный метод отправки остается только у агрегата.
Интересно, что мы невольно пришли у себя на проекте к такой же архитектуре, только двигаясь из классического DDD. Мы объявляем агрегат (но это агрегат не в терминологии Эванса, а как раз комбинация сущностей, что-то вроде вашего
AssignData
), собираем его за один запрос целиком в слое инфраструктуры, а сам он при этом выполняет свою бизнес-логику независимо от IO. Широко используется сокрытие в рамках одной сборки (модификаторinternal
в C#, на котором мы пишем), чтобы слою приложения вообще нельзя было сломать логику.В вашем случае, например, в примере с Barcoder слой приложения может не проверить единственность одной из коробок, и тогда Domain-слой сработает неправильно. Как мы делали мы. Вообще, паковать одну коробку в несколько и несколько в одну выглядит разными бизнес-операциями. Но если нужно в одной, то:
Domain:
Application:
Infrastructure:
Таким образом, почти никакие манипуляции из слоя приложения не сломают данные и не смогут обойти ограничения в бизнес-логике.
Удивительно, конечно, что он отсылает к истории, когда Финляндия буквально воевала на стороне фашистов, и это как бы не то, что считается чем-то хорошим в наши дни.
Ну, честно говоря, фигня. 600к не деньгами, а на облако, причём с ограничением в год. Я трачу на облако в год тысяч 30 максимум, и на этом серваке живут все мои проекты. То есть по сути приз это эквивалент 30к рублей.
Рабочий ноут != корпоративная лицензия всё-таки. Не на любой рабочий ноутбук запрещают ставить личный софт в личных целях. Но у меня в любом случае на личном всё установлено.
Так а у вас корпоративная лицензия или личная?
Ну то есть дневной заработок нормального айтишника :)
Ой, а как так получилось?
А для чего ещё?
Скопировали только IDE для джавы. Что делать с Rider, WebStorm, RustRover итд?
У меня личная лицензия купленная мною для личных целей. В статье не сказано, что блокированы именно корпоративные лицензии.
Покажите мне комьюнити-версию Rider или WebStorm.
А если человек в отпуске делает личный пет-проект?
Тоже хотел написать. Райдер особо ничем не заменить, даже решарпер поверх студии работает куда хуже.
Miro разослали клиентам из России письмо о предстоящем отключении, а через несколько дней разослали повторное с содержанием типа: "Мы почитали внимательно законы, и выяснили, что можем вас не отключать, пользуйтесь дальше".
Люди изнутри говорили, что действующим сотрудникам настоятельно не рекомендуют ездить в отпуск в РФ.
Как раз пользователи айфонов больше всего должны радоваться возможности платить устройством, а не клеить на телефон за 200к колхозный стикер )
Там же облако для синхронизации платное (не путать с публикацией). Как мне удобно работать в Обсидиане с двух ноутов, десктопа и телефона?
Неужели кто-то ещё пишет комментарии?