Önce yazının uzunluğundan özür dileyerek başlayayım, ama gerçekten çok fazla ayrıntı iletmek istedim, bu yüzden yorumlarda ileri geri gitmiyorum.
Bir DDD yaklaşımı izleyen bir uygulama tasarlıyorum ve bir Agrega Kökü'nün başka bir AR içermesi veya ayrı, "bağımsız" AR'ler olarak bırakılması gerekip gerekmediğini belirlemek için hangi rehberliği takip edebileceğimi merak ediyorum.
Çalışanların kendilerini gün içinde veya dışında saatlerini izlemelerini sağlayan basit bir Zaman Saati uygulaması ele alın. Kullanıcı arabirimi, çalışan kimliğini ve PIN kodunu girmelerine izin verir, bu daha sonra doğrulanır ve çalışanın geçerli durumu. Çalışan saatte çalışıyorsa, kullanıcı arabirimi bir "Saat Dışı" düğmesi görüntüler; ve tersine, eğer saat ayarlı değillerse, düğme "Saat Girişi" yazar. Düğmenin yaptığı işlem, çalışanın durumuna da karşılık gelir.
Uygulama, bir RESTful hizmet arabirimi aracılığıyla maruz bir arka uç sunucusu çağıran bir web istemcisidir. Sezgisel, okunabilir URL'ler oluşturma konusundaki ilk geçişim şu iki uç noktayla sonuçlandı:
http://myhost/employees/{id}/clockin
http://myhost/employees/{id}/clockout
NOT: Bunlar, çalışan kimliği ve PIN doğrulandıktan ve "kullanıcıyı" temsil eden bir "jeton" başlıkta iletildikten sonra kullanılır. Bunun nedeni, bir yöneticinin veya amirlerin başka bir çalışanı saatlerine ayırmasına veya çıkarmasına izin veren bir "yönetici modu" olmasıdır. Ama bu tartışma uğruna bunu basit tutmaya çalışıyorum.
Sunucuda, API sağlayan bir ApplicationService var. ClockIn yöntemi için ilk fikrim şuna benzer:
public void ClockIn(String id)
{
var employee = EmployeeRepository.FindById(id);
if (employee == null) throw SomeException();
employee.ClockIn();
EmployeeRepository.Save();
}
Bu, Çalışanın zaman çizelgesi bilgilerinin aslında bir işlem listesi olarak tutulduğunu fark edene kadar oldukça basit görünüyor. Bu, ClockIn veya ClockOut'u her aradığımda, doğrudan Çalışanın durumunu değiştirmiyorum, ancak bunun yerine Çalışanın Zaman Çizelgesine yeni bir giriş ekliyorum. Çalışanın mevcut durumu (saatli veya değil), Zaman Çizelgesi'ndeki en son girişten türetilir.
Bu nedenle, yukarıda gösterilen kodla gidersem, depomun Çalışanın kalıcı özelliklerinin değişmediğini, ancak Çalışanın Zaman Çizelgesine yeni bir giriş eklendiğini ve veri deposuna bir ekleme gerçekleştirdiğini tanıması gerekir.
Öte yandan (ve işte yazının nihai sorusu), TimeSheet, bir Agrega Kökü olduğu gibi kimliğe (çalışan kimliği ve dönemi) sahip gibi görünüyor ve TimeSheet ile aynı mantığı kolayca uygulayabilirim. (Çalışan kimliği).
Kendimi iki yaklaşımın esasını tartışırken buluyorum ve açılış paragrafında belirtildiği gibi, hangi yaklaşımın soruna daha uygun olduğunu belirlemek için hangi kriterleri değerlendirmem gerektiğini merak ediyorum.