Я занимаюсь разработкой приложения с C#. NET способом DDD. Я также проверил eshopcontainers , но он не объясняет, что я хотел бы знать, поэтому позвольте мне задать вопрос здесь. У меня вопросы
- Можно ли частично обновить агрегат root непосредственно из пакетной операции?
Подробно
Я разрабатываю приложение RSVP. Теперь я хотел бы отправить письмо с напоминанием людям, которые еще не проголосовали. Моя модель домена и слой инфраструктуры похожи на это.
//Domain Model
class RSVP //RootAggreagate
{
public long Id {get; private set;}
public List<TimeSlot> TimeSlots {get; private set;}
public AutoRemindRule AutoRemindRule {get; private set;}
}
class AutoRemindRule
{
public long Id {get; private set;}
public int IntervalHour { get; private set; }
public DateTimeOffset NextTriggerDate { get; private set; }
public DateTimeOffset RemindBeginDate { get; private set; }
//Foreign Key for Plan
public long RSVPId
void SetNextTriggerDate()
{
//Compute NewNextTriggerDate based on IntervalHour and RemindBeginDate field.
NextTriggerDate = NewNextTriggerDate;
}
}
//Infrastructure Layer (EF Core)
public class MyDbContext : DbContext
{
//Plan Aggregate
public DbSet<RSVP> RSVPs { get; set; }
public DbSet<TimeSlot> TimeSlots { get; set; }
public DbSet<AutoRemindRule> AutoRemindRules { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
}
}
В этой модели я хотел бы запускать пакет, который периодически проверяет NextTriggerDate
в AutoRemindRules
, и если NextTriggerDate
старше, чем сейчас , партия отправляет письма пользователям, которые не проголосовали за RSVP. В конце концов, пакет обновляет NextTriggerDate
, вызывая SetNextTriggerDate
. Если я напишу код, подобный следующему, на уровне Usecase (Application) в пакете, я пойму, чего хочу. Однако я не думаю, что эти коды следуют правилу DDD, поскольку оно частично обновляет совокупность root. Можно ли написать такой код на уровне приложения или, если нет, кто-нибудь может сказать мне лучший способ кодирования?
//Usecase(Application) layer in a batch
using (var context = new MyDbContext)
{
var rules = context.AutoRemindRules.Where(i => i.NextTiggerdate < DateTimeOffset.Now);
foreach (var rule in rule)
{
SendRemindMail();
rule.SetNextTriggerDate();
context.SaveChanges();
}
}
Обновление
Другой подход заключается в создании метода для обновления AutoRemindRule
в совокупности root, и пакет использует этот метод. Однако меня беспокоит производительность и нагрузка на БД. в этом случае пакет должен прочитать кучу ненужных записей RSVP в дополнение к AutoRemindRule
записям. Мне интересно, есть ли другой подход, который заключается в меньшей нагрузке на БД при сохранении метода DDD.