2009-11-24 20 views
11

DDD metodolojisini inceleyerek birkaç ay geçirdikten sonra, bu kavramları şirketimdeki gerçek ürünlere uygulamaya başladım. Aslında, gelecekteki gelişim için uygun ve sürdürülebilir bir mimari oluşturmakla görevlendirildim. N Katman Gelişiminde DDD Kavramları

Aşağıdaki teknolojilerin kullanımını yapmaya karar verdik: EF4'ü (gerçekten v2) Birlik

Ben en çok aydınlatıcı oldu elde ettik bilgi miktarı, ancak, en iyi birkaç soru ile kaldım uygulama:

Soru # 1:DTOs - En İyi Uygulamalar

alan adı nesneleri (POCO sınıfları) var. Bu sınıfları uygulamak için çeşitli yollar vardır.

  1. Geleneksel Yaklaşım: Kamu getters/çıkaranlar, Doğrulama, & uygun iş mantığı içeren POCO sınıflar oluşturun. Ayrıca DTO'lar oluşturun ve bunları yönetmek için haritalama tekniklerini kullanın. (Automapper)
  2. Geleneksel - DTO: Yukarıda belirtildiği gibi POCO sınıfları oluşturun, ancak POCO'larınızı aktarım nesneleri olarak kullanın. Bu benim anlayışım, iş objelerinin alandan asla ayrılmaması gerektiğidir.
  3. Hibrit: Yazarın kendi POCO nesnelerini ve DTO'larını oluşturduğu ilginç bir blog post tökezledim. Etki alanı nesnesinin içinde DTO'nun bir örneğini oluşturur. Bu, # 1'deki gibi mülklerinizi çoğaltmamanız için daha kolay bakım sağlar. böylece gibi:
 
public abstract class POCOBase<T> : ValidationBase, IPOCO where T : DTOBase, new() 
{ 

public T Data { get; set; } 

public POCOBase() 
{ 
    Data = new T(); 
} 

public POCOBase(T dto) 
{ 
    Data = dto; 
} 
    } 

    public class SomePOCO : POCOBase { } 

    public class SomeDTO : DTOBase 

    { 

public String Name { get; set; } 

public String Description { get; set; } 

public Boolean IsEnabled { get; set; } 
} 


// EXAMPLES 
// POCOBase<SomeDTO> somePOCO = new SomePOCO(); 
// somePOCO.Data.Name = "blablabla"; 
// somePOCO.Validate(); 
// return somePOCO.Data; 

Soru 2:hangi nesneler UI/Servis Katmanı tarafından iade edilmesi gerekir?

Bu, DTO'nun tamamıdır. Sadece çıplak özellikleri içeren çok basit, hafif bir nesne. Ayrıca, herhangi bir Doğrulama sonucu içermiyor. DTO'larım müşteriye geri serileştiriyorsam, müşterinin InvalidRules koleksiyonu gibi herhangi bir Doğrulama sonucuna ihtiyacı olduğu varsayılmalıdır. Örneğin, Amazon'un API'siyle çalıştığımı söyleyin. Kişisel mağazama bir kitap eklemek istiyorum. ISBN'sini göndermeden bir kitap eklemeyi denerseniz, hizmet, Doğrulama sonucu hatalarını içeren bir çeşit yanıt grubu getirebilir.

Bir şey mi eksik? DTO'ların hiçbir iş mantığı içermemesi gerektiği izlenimi altındaydım (en azından DDD'den "püristler"). Bana öyle geliyor ki, DTO'lar transfer nesneleri olarak yeterli bilgi sağlamıyor. Ya DTO ve Doğrulama sonuçlarını kapsülleyen yeni bir Response nesnesine ihtiyacım var.

Soru # 3:Ne kadar çok IoC var?

"değişir uygulamanın gelebilecek bölümlerini ve aynı kalmak bu ayrı:

Ben altın kuralı takip gerektiğini bana belli gibi görünüyor."Bana göre

bu IoC uygulanması açısından mantıklı. Bağımlılıkları, tüm bir IoC konteyner üzerinden iletişim benim Sunum, İş Mantık ve Veri Erişim katmanları azaltmak. Benim Uygulama katmanı ortak arayüzleri ve soyutlamalar içerir. Öyle görünüyor IoC'yi bundan çok daha fazla kullanmak için overkill'I Ben sahte test Havuzları yaratabildiğim gerçeği seviyorum - ve basitçe Unity'nin konfigürasyonunu değiştirerek, TDD'yi kullanabilirim.

Umarım bu soruları açıkça belirtmişimdir. Yardımınız için:

+2

Gelecekte, lütfen her bir soruyu ayrı bir StackOverflow sorusu olarak belirtin ... –

cevap

18

Sorularınızı tek tek cevaplamaya çalışacağım

Cevap 1

DTOs onlar bir uygulamanın mimaride farklı bir yerde, farklı bir amaca hizmet nedeniyle DDD ortogonaldir. Bu, DTO'ların bir Etki Alanı Modelinde yer almadıklarını çünkü hiçbir davranışının olmadıklarını ve dolayısıyla Anemic Domain Models'a yol açacaklarını söyledi.

Kalıcılık ile POCOs Cehalet gitmenin yoludur. Jeremy Miller iyi bir article that explains this concept var. Alan Modeli üstüne oturup

Cevap 2

Katmanlar genellikle söz konusu amaç için uyarlanmış kendi nesneleri döndürmek gerekir.

UI'ler için, MVVM deseni özellikle iyi çalışır. This article, WPF için MVVM'yi sunar, ancak model ayrıca ASP.NET MVC'de bir çekicilik gibi çalışır.

Web servisleri için DTO modelinin geçerli olduğu yer burasıdır. WCF Veri Sözleşmeleri, merak ediyorsanız, DTO'lardır :)

Bu, hizmet arabirimi ile Etki Alanı Modeli arasında ileri ve geri gitmeyi gerektiren bir çok eşleşme gerektirecektir, ancak bu, Esnek Tasarım için ödemek zorunda olduğunuz bedeldir. Bu konuda AutoMapper yararlı bulabilirsiniz.

daha IoC Cevap 3: Sorunuza daha iyi, ama bir şey bana vurdu (gerçekten DI): Bir DI Konteyner sadece nesne grafiği kadar Tel ve ardından yoldan çekil gerekir. Nesneler DI Konteynerine güvenmemelidir. Daha fazla bilgi için bkz. this SO answer.

+0

Yorumunuz için teşekkürler Mark. Anemik etki alanı modellerinin, etki alanı nesneleri herhangi bir iş mantığında geçersiz olduğunda ortaya çıkması benim anlayışım. Avcı/bekçi çantası olarak kalırlar. ADM'nin bir başka noktası da, mantıksal (doğrulama gibi), içinde bulunandan ziyade nesnenin dışında gerçekleşmesidir. Soru # 1'e geri döndüğünüzde Hybrid yaklaşımı ... bana kalıcı bir cahil etki alanı nesnesi içinde bir DTO örneği oluşturuyorsa, mutlaka bir anemik etki alanı modeli oluşturmaz. Haklısınız, bununla birlikte DDD prensiplerini kırıyor. Bunu biraz daha fazla kazmalıyım. – Daniel

+0

Cevap 2 mükemmeldi. Özel dönüş nesneleri oluşturmam gerekebileceğine dair bir eğilimim vardı. MVVM ile ilgili tavsiyeler için teşekkürler ... kesinlikle bir göz atacaksınız. – Daniel

+0

Şu anda DI Kapsayıcılarımı ASP.NET web.config dosyasında yapılandırarak ayarlamak için Global.asax'ı kullanıyorum. Cevabınız 3 için, eğer doğru bir şekilde anlıyorsam: TDD yöntemlerini uygulamak için, sadece "anında" metodunun kendisinde bulunan DI konfigürasyonunu kaydetmeliyim? – Daniel

İlgili konular