Eğer insanlar bunun ölümüne dövüldüğünü düşünürlerse önceden özür dilerim. Son birkaç saatimi SO'da çok sayıda mükemmel gönderiyi okumak ve okumakla geçirdim ama hala kafam karıştı.DDD, Deposu ve Enkapsülasyon
Benim karışıklığımın kaynağı DTO ve DDD ve depolar. POCO alanımdaki nesnelerin akıllılara sahip olmasını istiyorum ve bunları depolardan almak istiyorum. Ama bu işi yapmak için bazı kapsülleme kurallarını ihlal etmem gerekiyor gibi görünüyor ve DTO'ları başlarına döndürecek gibi görünüyor.
İşte basit bir örnek: Katalog uygulamasında, bir parça, bir dizi başka parça içeren bir paket olabilir. Bu nedenle, Part POCO'nun IEnumerable < Part> 'i döndüren' GetChildren() 'yöntemine sahip olması mantıklıdır. Dışarı çıkarken listeyle başka şeyler bile yapabilir.
Fakat bu liste nasıl çözümleniyor? Şimdi deposundan (doğru) yükleme bölümlerine ek olarak Katalogumda, tüketiciler, Ayrıca bazı Bölüm-kapsüllü bypass
interface IPartRepository : IRepository<Part>
{
// Part LoadByID(int id); comes from IRepository<Part>
IEnumerable<Part> GetChildren(Part part);
}
Ve
class Part
{
...
public IEnumerable<Part> GetChildren()
{
// Might manipulate this list on the way out!
return partRepository.GetChildren(this);
}
}
: depo gibi görünüyor cevaptır GetChildren (bölüm) doğrudan arayarak mantık. Bu kötü değil mi?
Depoların POCO'lara hizmet etmesi gerektiğini, ancak DTO'ların 'katmanlar arasında' veri aktarımı için iyi olduğunu okudum. Birçok parça mülkiyeti hesaplanır - fiyatlar örneğin karmaşık fiyatlandırma kurallarına göre hesaplanır. Bir fiyat, bir depodan gelen bir DTO'da bile olmayacaktır - bu nedenle, fiyatlandırma verilerini bir web hizmetine geçirmenin, DTO'nun, Bölümü başka bir şekilde değil, Tüketimi tüketmesini gerektirmesi gibi görünüyor.
Bu zaten çok uzun sürüyor. Kafam nasıl çözüldü?
İlginç. Fakat 'GetChildren (bölüm)' i IPartServis'e taşıyın ve onu parçadan kaldırın ve sonra 'Part sınıfının hala bir Childparts özelliği var.' Ya kısmen çocuklarına masaj yapması gerekiyorsa? – n8wrl
Eğer masajı depodan aldığınızda hemen gerçekleşmesi gerekiyorsa, bu mantığı 'IPartService.GetChildren() 'içine koyardım. Çocuk bölümlerini isteğe bağlı olarak değiştirebilmeniz gerekiyorsa, 'IPartService.UpdateChildPartPrices (Part part)' gibi başka bir hizmet yöntemini kullanabilirsiniz. (Ya da her ikisi de - "UpdateChildPartPrices" öğesini "GetChildren" olarak adlandırırsınız.) –
Zaman ayırdığınız için teşekkürler, Jeff! – n8wrl