2009-03-28 8 views
18

Tümü Altyapı katmanı içindeki tüm Etki Alanı Katmanlarınızın (Modüller, Modeller, Varlıklar, Etki Alanı Hizmetleri vb.) Tüm arabirimlerini gruplamak mantıklı mı? Aksi takdirde, bunların hepsini paylaşılan bir kitaplığa ayıran bir "paylaşımlı" proje/bileşen oluşturmak mantıklı mıdır? Sonuçta, "Altyapı Katmanı" tanımı "Etki Alanı, Uygulama ve Kullanıcı Arabirimi katmanları için paylaşılan kütüphaneler" içerir.DDD: Etki Alanı Arabirimleri, Altyapı nerede tutulur?

Kod tabanımı DDD katmanları etrafında tasarlamayı düşünüyorum: UI, Uygulama, Etki Alanı, Altyapı. Bu saygılı 4 proje yaratacaktır. Benim amacım, Etki Alanı Katmanı'ndan Altyapı Katmanı'nı referans göstermektir. Ancak, Domain Layer projesindeki arabirimleri tanımlarsanız, IPost için söyleyin, IPostRepository.Save (IPost post) yöntemini tanımlarken, Altyapı projesinden Etki Alanı Katmanı projesine başvurmanız gerektiğinde, bir circulur referansı olacaktır. . Bu nedenle, "Paylaşılan kitaplıktaki tüm arabirimleri tanımlayın" fikri.

Belki de depoların bir nesnenin kaydedilmesini beklememesi gerekir (IPostRepository.Save (IPost yayını)), ancak nesnenin paramslarını beklemeniz gerekir (bu, Save() olsada uzun bir param kümesi olabilir). Bu bir nesne aşırı karmaşık oluyor zaman gösteren bir ideal durum olabilir ve ek değer Nesneler bunun için göz önünde bulundurulmalıdır.

Düşünceler?

cevap

24

Eric, Bir çift için uzaktayım, o yüzden çok geç cevap verdiğim için beni affedin. Depoları nereye koyacağınızla ilgili olarak, şahsen her zaman depoları özel bir altyapı katmanına (ör. MyApp.Data.Oracle) yerleştirdim, ancak depoların alan katmanına uymak zorunda olduğu arabirimleri bildirdim.
Projelerimde, Uygulama Katmanı, etki alanı ve altyapı katmanını yapılandırmaktan sorumlu olduğu için Etki Alanı ve Altyapı katmanına erişmelidir.
Uygulama katmanı, uygun altyapıyı etki alanına enjekte etmekten sorumludur. Alan, hangi altyapı ile konuştuğunu bilmez, yalnızca nasıl arayacağını bilir. Tabii ki, bağımlılıkları etki alanına enjekte etmek için Structuremap gibi IOC kapları kullanıyorum. Yine, bunun DDD'nin projelerinizi nasıl yapılandırılacağını önerdiği anlamına gelmediğini, bunun sadece bir yol olduğunu, uygulamalarımın mimarisini yapıyorum. Şerefe.

+2

Mükemmel Geobarteam. Bu bana "duh" bir an verdi. Evet, Domain'deki arabirimleri tanımlayın, depolar ayrı toplantılarda uygulanmalıdır (MySqlProviver, MsSqlProvider, XmlProvider, vb) Ve App katmanında onu bağlamak için kullanılan IOC Konteyner (Castle Windsor I love) bir tür. Mükemmel. – eduncan911

+1

ASP.NET MVC durumunda, aslında Denetleyici (UI) içine depo enjekte etmek kolaydır katmanları) Kale Kafeteresi'nden Steven Sanderson, ASP.NET MVC Framework Önizleme'de buna iyi bir örnek oluşturdu. -Driven Design Hızla kitap UI, App ve Domain'in Infra'yı kullanabileceğini söyledim. – eduncan911

+1

Bu konuda sahip olduğum tek sorun, kitabımın Infrastructure'ın hiçbir zaman hiçbir şeye gönderme yapmadığını söyledi. UI-> Uygulama, Etki Alanı ve Infra. App-> Domain ve Infra. Ve, Domain-> Infra. Biliyorum biliyorum, her şeyden önce kurallar olduğunu varsayalım. – eduncan911

3

yüzden tereddüt etmeyin ben DDD yeni öyledir Eğer katılmıyorum diye, eğer benimle aynı fikirde olup olmadığınızı anlamaya çalışıyorsanız, o zaman neden öğrenmeniz gerektiğini anlamıyorum. Altyapı katmanı etki alanınızdan. Benim düşünceme göre alan, altyapıya bağlı olmamalıdır. Etki alanı nesneleri, üzerinde çalıştıkları veritabanında veya hangi posta sunucusunun posta göndermek için kullanıldığı konusunda tamamen bilgisiz olmalıdır. Altyapıyı alandan soyutlayarak yeniden kullanılması daha kolaydır; Çünkü alan, hangi altyapının çalışmakta olduğunu bilmemektedir.

Kodumda yaptığım şey, altyapı katmanımdan (ancak tam tersi değil) etki alanı katmanına başvuruyor. Depolar, etki alanı nesnelerini bilir; çünkü rolleri, etki alanı için durumu korumaktır. Depolarım temel kümelerim için temel CRUD işlemlerimi içerir (get (id), getall(), kaydet (object), delete (object) ve denetleyicilerimden çağrılır.

Son projemde yaptıklarım (Benim yaklaşımım tamamen DDD değil, oldukça iyi çalıştı. Bağlantılarım ile arayüzlerimi soyutladım. Kök agregatları somut bir Deponun türünü geçirerek somutlaştırılmak zorundaydı:

Kök agregatının, Deponun Get (ID) ya da Create() yöntemini kullanarak bir depo.Antikayı inşa eden beton Deposu, agreganın kendi devletini ve çocuk nesnelerini koruyabilmesini, ancak somut uygulamanın herhangi bir şeyini bilmeden geçebilmesini sağladı. Deponun ör .:

public class PostRepository:IPostRepository 
{ 
    ... 
    public Post Create() 
    { 
     Post post=new Post(this); 
     dbContext.PostTable.Insert(post); 
     return post; 
    } 
    public Save(post) 
    { 
     Post exitingPost=GetPost(post.ID); 
     existingPost = post; 
     dbContext.SubmitChanges(); 
    } 
} 

public class Post 
{ 

    private IPostRepository _repository 
    internal Post(IPostRepository repository) 
    { 
     _repository = repository; 
    } 
    ... 
    Public Save() 
    { 
     _repository.Save(this); 
    } 

} 
+0

Bununla nereye gittiğinizi biliyorum. Sadece DDD kitabımda, depoların Altyapı katmanında olduğu belirtiliyor. Ancak, ağda bulduğum çakışan bilgiler, depoları Domain katmanına koyar. – eduncan911

+0

Ayrıca, UI Katmanının "Uygulama, DOmain ve Altyapı" na erişmesi, Uygulama Katmanı'nın "Etki Alanı ve Altyapı" na erişmesi ve son olarak da Etki Alanı Katmanının "Altyapıya" erişmesi savunulmaktadır. Bu "DOmain Driven Design Quickly" kitabından. Dolayısıyla bunun sebebi nedir? – eduncan911

+11

Bu, çivilemek için zor bir bilgidir. Ne * düşündüm * Ben keşfettim ki * alanları için * arayüzler etki alanı için bir "dikiş" tanımladığından Domain katmanında gider. Depoların * uygulamaları “Altyapı katmanına gider.” Etki Alanı'nızı halihazırdaki uygulama bağlamından tamamen çıkarmaya karar verdiğinizi ve yepyeni bir yapı oluşturmaya karar verdiğinizi hayal edin.Yazılımların arayüzlerini istersiniz, ancak uygulamaların zorunlu olmasını istemezsiniz. – jlembke

3

Ben Onion architecture düşünmenizi tavsiye ediyorum. DDD ile çok güzel uyuyor. fikir depo arayüzleri sadece doğrudan Domain ve referans varlıkları dışındaki bir katmanda oturup olmasıdır:

IPostRepository.Save(Post post)

Alan hiç depoları hakkında bilmek gerekmez. Altyapı katmanı, Etki Alanı veya başka bir kişi tarafından başvurulamaz ve diğer G/Ç ile ilgili öğeler arasında depoların somut uygulamalarını içerir. Çeşitli yardımcılara sahip ortak kütüphane, bu durumda Uygulama Çekirdeği olarak adlandırılır ve herkes tarafından referans alınabilir.

+0

Yanlış Etki Alanı deposu Depoları ve Ağ Geçitleri arabirimi Altyapı "katman" bunları uygular. – Mik378