Deutsch

Непонятки с DDD

1002  
AlexNek патриот24.12.23 18:31
AlexNek
NEW 24.12.23 18:31 

Есть следующие классы: - вопрос: зачем переопределили 'public new ValueId<TIdType> Id' в AggregateRoot. EF дуреет.

public abstract class AggregateRoot<TId, TIdType> : Entity<TId>
    where TId : ValueId<TIdType>
{
    public new ValueId<TIdType> Id { get; protected set; }
    protected AggregateRoot(TId id)
    {
        Id = id;
    }
    protected AggregateRoot()
    {
    }
}
public abstract class Entity<TId> : IEquatable<Entity<TId>>, IHasDomainEvents
    where TId : notnull
{
    private readonly List<IDomainEvent> _domainEvents = new();

    public TId Id { get; protected set; }

    public IReadOnlyList<IDomainEvent> DomainEvents => _domainEvents.AsReadOnly();

    protected Entity(TId id)
    {
        Id = id;
    }
...
}
public abstract class ValueId<TId> : ValueObject
{
    public abstract TId Value { get; protected set; }
}
#1 
alex445 коренной житель24.12.23 20:19
24.12.23 20:19 
в ответ AlexNek 24.12.23 18:31

У вас архитекторы не пишут комментов к своему гениальному коду?

#2 
AlexNek патриот24.12.23 20:28
AlexNek
NEW 24.12.23 20:28 
в ответ alex445 24.12.23 20:19
alex445 коренной житель24.12.23 20:45
NEW 24.12.23 20:45 
в ответ AlexNek 24.12.23 20:28, Последний раз изменено 24.12.23 20:46 (alex445)

Чё это за хрень? В EF уже из коробки есть ORM, Repo, Unit of fucking work и ag... aghhh... aggregation root. Наф ещё чёто поверх городить? Руки чешутся пописать лапшу? ))

#4 
AlexNek патриот24.12.23 22:04
AlexNek
NEW 24.12.23 22:04 
в ответ alex445 24.12.23 20:45, Последний раз изменено 24.12.23 22:21 (AlexNek)
Чё это за хрень?

всего 9 мин. Или хотите Вон Верона и Эрика Эванса - там по часу миг

В EF уже из коробки есть ORM, Repo, Unit of fucking work и ag... aghhh... aggregation root

примерчик есть? Там совсем не то.

#5 
AlexNek патриот24.12.23 22:41
AlexNek
NEW 24.12.23 22:41 
в ответ AlexNek 24.12.23 22:04

Хм, тут ентого нет. Но у него еще дофига уроков...


#6 
alex445 коренной житель25.12.23 01:05
NEW 25.12.23 01:05 
в ответ AlexNek 24.12.23 22:04

Чем транзакции не устроили? Собираете изменения по дереву сущностей с этим вашем корнем агрегации (главной сущностью), и сохраняете пачкой. У меня сейчас в приложухе начала 2000-х подобная же хрень происходит. Придумали какой-то домен, хотя всегда это была бизнес-логика (логика бизнес-процессов, для которых создавалось приложение) или ещё как-то. События какие-то у сущностей. Я как-то лет десять назад тоже событие написал у себя в классах бизнес-логики, типа на склад добавился товар - оповестить подписантов. Всё, у меня DDD. Придумали какие-то новые слова для старых вещей, чтобы со сцены дурачкам продавать. Все давно такие или подобные приложения писали, а тут нашлись чуваки, решившие продать старьё под чуть новым соусом.


Кто знает - работает, кто не знает - множит сущности, запутывает всё, а потом за деньги пытается распутывать - вобщем, зарабатывает на развешивании лапши на уши. Или вот ещё каждый выскочка, даже если ему повезло что-то сделать и он применил какой-то немного не такой подход, бежит навешивать своё имя на это и рассказывать, какой он гуру, и вот у него пачка платных курсов по этой теме.


Сами-то сможете сказать, где в вашем приложении и чем отличается model, domain, business logic и ещё хрен знает что? На собесах такие "назовите 10 отличий хрен-дривен от редька-дривен девелопмент (у меня в шпаргалке под столом так написано)" - "ля, чувак, я и двух не припомню, а ты целыми десятью себе голову забил!".

))

#7 
alex445 коренной житель25.12.23 01:09
NEW 25.12.23 01:09 
в ответ alex445 25.12.23 01:05
Чем транзакции не устроили?

У вас уже в БД всё промоделировано, а EF дал удобный интерфейс для конвергенции этих двух миров (ООП и БД). Берёте любой объект (таблицу) и сохраняете его изменения и всех их зависимостей по дереву связей как хотите, после чего всё пачкой сохраняете. Чего он там билдинг блокс делает какие-то, непонятно.

#8 
alex445 коренной житель25.12.23 01:16
NEW 25.12.23 01:16 
в ответ AlexNek 24.12.23 22:04

Лять, какая херня! А если мне не надо по всему приложению переопределять все возможные операторы сравнения для объектов, приписывать им уникальные айдишники (а что, с БД не устроили?) и прочее, а надо только для части объектво? Всё, у меня не DDD? Вот есть пачка замороченных объектов, я для них написал там все эти сравнения, отслеживание версий объекта и прочее. А для остальных - забил. Что у меня? DDD, MVC, TDD или химера?

#9 
AlexNek патриот25.12.23 12:24
AlexNek
NEW 25.12.23 12:24 
в ответ alex445 25.12.23 01:16
А для остальных - забил. Что у меня? DDD, MVC, TDD или химера?

Зная ваши предпочтения, я бы вообще не рекомендовал это смотреть. Ведь всё от неверных или шаманов пытающихся продать свои сказки.


а что, с БД не устроили?

тут есть маленький ньюанс, что ид с БД приходят после создания объекта (записи объекта в базу)

#10 
MrSanders коренной житель25.12.23 12:28
NEW 25.12.23 12:28 
в ответ AlexNek 24.12.23 18:31
вопрос: зачем переопределили 'public new ValueId<TIdType> Id' в AggregateRoot. EF дуреет.

А вот кто их знает... Чтобы подчеркнуть что это не ID объекта (Entity) а ссылка на Entity по ID?

#11 
AlexNek патриот25.12.23 12:48
AlexNek
NEW 25.12.23 12:48 
в ответ MrSanders 25.12.23 12:28
Чтобы подчеркнуть что это не ID объекта

Тоже вот идей особых нет. хммм При этом все агрегаты будут иметь одинаковый тип ИД, что вроде не очень хорошо.


И в самом первом видео такого нет, но помню есть еще одно. Скорее ради чего то другого изменили.

Но в данном случае, не имею понятия как написать конверторы для EF, особенно когда отношение много-много.


И не хочет еще что-то EF работать со ссылками на объекты (типа UserId), если есть в агрегате объект, то в таблицу пишет его ИД без проблем, а если в агрегате UserId, то пока не нашел способа записать также ИД для всех вариантов.

#12 
alex445 коренной житель25.12.23 14:33
NEW 25.12.23 14:33 
в ответ AlexNek 25.12.23 12:24, Последний раз изменено 25.12.23 14:35 (alex445)
а что, с БД не устроили?
тут есть маленький ньюанс, что ид с БД приходят после создания объекта (записи объекта в базу)

Ну будете вы генерить айди не там, где храните объект, а там, где создаёте. Смысл? Теперь у вас в БД будут либо таблицы без ключей, либо ключи без генерации, что вообще не свойственно для реляционных БД. Т.е. они как бы уникальные и ключи, но генерятся на стороне - т.е. БД по идее не должна их рассматривать как уникальные ключи, т.к. сгенерены не ей самой были - нет доверия, нужна валидация. Т.е. вводить уже на стороне БД проверку на уникальность при добавлении каждого нового объекта с ключом. А это лишние вычисления. Нахрена, если проще создать уже сразу в БД, которая и позаботится об уникальности?


Вот в моём проекте нет БД, я всё храню в файлах, поэтому и генерю айдишники на клиенте (серверной логики у меня тоже нет). Всё, у меня уже DDD? Правда, я его применяю, не бегая по сцене со своими умными лекциями.


Кстати, непонятно, зачем все эти перегрузки операций сравнения, если у вас есть айди на любой объект? Вам теперь достаточно сравнивать лишь айдишники.

#13 
AlexNek патриот25.12.23 19:41
AlexNek
NEW 25.12.23 19:41 
в ответ alex445 25.12.23 14:33
Ну будете вы генерить айди не там, где храните объект, а там, где создаёте. Смысл?

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

Хотя какое то время назад тоже не имел никаких проблем с генерацией ид на стороне базы. И в каких то случаях может и будет гораздо лучше, так как никакая архитектура не может быть одинаково хороша для всех проектов.


БД по идее не должна их рассматривать как уникальные ключи

как скажем так и рассматривает.

#14 
alex445 коренной житель28.12.23 16:07
NEW 28.12.23 16:07 
в ответ AlexNek 24.12.23 18:31

Непонятки с DDD

Щас вам всё объяснят... ))


#15 
AlexNek патриот28.12.23 22:11
AlexNek
NEW 28.12.23 22:11 
в ответ alex445 28.12.23 16:07

Кстати, говоря, очень толковые ответы попадаются.

И вопросы не обязательно задаются, что-бы получить на них объяснение.

Сам процесс формулирования вопроса и реакция на него может дать очень много полезного.

Иногда бывает, что уже на этапе формулирования вопроса видишь в чём проблема.

#16