Depo Kalıbı: Lazy Load nasıl? ya ben bu Agrega bölünmüş mıdır?

oy
66

Bir Editör ve bir proje kavramı vardır etki alanı modeli var.

Bir Editör Projelerinin bir numarasına sahiptir ve Proje Editör sahibini değil, aynı zamanda Editör üyeleri bir dizi değil sadece sahiptir. Bu nedenle, bir Editör ayrıca birleştirilmiş Projelerinin bir numarası vardır.

Bu modelleme ve kalıcılık için Depo kalıbı kullanarak bir DDD yaklaşımı alıyorum. Ancak, ben bunu nasıl belirlemek için henüz yeterince desen grok yoktur.

Ben kök olmak Editör ile, Editör ve Proje aynı agrega potansiyel vardır varsayımı üzerinde çalışıyorum. Bu nedenle bir Editör almak ve daha sonra kendi Projeleri belirlerse, ve oradan Projeler üyesi Editörler numaralandırmak olabilir edebilirsiniz.

Ben sadece deposundan Editörler almak iznim Ancak, ben onları sahibi Editör olsun deposundaki bütün Projeleri yüklemek zorunda demek değil mi? Ben üye Editörler tembel yük istiyorlarsa, Proje yanı deposuna başvuru ihtiyacı var?

Ben agrega bölmek ve Editör depo ve bir proje depo varsa Alternatif olarak, nasıl böyle bir yeni proje bir Editor eklendiğinde olarak ikiye genelinde bir işlem, idare gerekir? Örneğin:

Editor e = new Editor(Editor Name);
editorRepository.Add(e);

Project p = e.CreateProject(Project Name);
projectRepository.Add(p);    // These two lines
editorRepository.Save(e);    // should be atomic

Ben Depo desen niyetini yanlış yorumlama muyum?

Oluştur 19/01/2009 saat 15:10
kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
3

Bu uygulamanın ihtiyaçlarına bağlıdır. Verilen bir Editör için Projelerinin tüm yük büyük bir sorun ise, bir gibi tembeller yükleme deseni deneyin Sanal proxy .

Eğer Sanal Proxy'yi kullanırsanız tembel, bir proje üyesi Editörler yükleme ile ilgili olarak, ben vekil etki alanının parçası olmak düşünmüyoruz beri bir sorun EditorRepository ile vekil enjekte görmüyorum.

Eğer Agrega bölmek varsa, araştırabilir Çalışma ait Birimi bölünmezlik bir çözüm olarak desen. Bu sorun olsa da, DDD özgü değildir ve ben işlem davranış için başka çözümler vardır eminim.

Cevap 23/01/2009 saat 01:45
kaynak kullanıcı

oy
4

Nasıl EditorOwner ve EditorMember içine sorumlulukları ayırmak konusunda?

böylece, örneğin, EditorOwner oldukça zengin olabilir (ve agrega kök olabilir) ama Projesi sadece üyeler hakkında sınırlı bir miktarda bilmeniz gerekebilir - Etki alanınızı bilmeden, onlar farklı sorumlulukları olurdu hayal ediyorum EditorMember amacı oldukça hafif olabilir.

Bunlar etki alanı nesneleri de kullanıcılar ile ilgili olabilir, ama bu başka bir bağlamda olacaktır.

şeyleri yardımcı, ya da sadece daha karmaşık yapar mı?

Cevap 23/01/2009 saat 03:55
kaynak kullanıcı

oy
0

Burada 2 farklı ilişkiler, mülkiyet diğeri üyelik için bir tane var.

sahiplik ilişkisi pek basit bir (her proje için bir sahibi) 'dir. üyelik ilişkisi birçok (proje tarafından birçok Editörler, editör tarafından birçok projeler) için birçok olduğunu.

Project sınıfında bir Sahibi özelliğini sağlamak ve belirli bir Editör tarafından sahip olunan tüm projeleri almak için ProjectRepository üzerinde bir yöntem sağlayabilir.

Birçok ilişki için, Proje sınıfının bir üye özelliği sağlar ve ProjectRepository bir yöntem üyesi olarak belirtilen Editör içeren tüm projeleri alır.

Ayrıca muhtemelen agrega bölmek, Editörler ve Projeler varlıklardır görünüyor, ama belki de bu terimleri bir agreganın subentities yapmak sizin bağlamda belirli bir anlamda kullanılmaktadır.

Cevap 11/02/2009 saat 12:01
kaynak kullanıcı

oy
30

Ben Depo desen niyetini yanlış yorumlama muyum?

Ben "evet" demek, ama ben ve ben aynı nedenle aynı şeyi istedi çalıştığım her kişinin ... olduğunu bilmek gidiyorum "Sen 4 boyutlu kırılma düşünmüyorsunuzdur Marty".

Şunu biraz basitleştirmek ve bunun yerine ilk yöntemleri oluşturma kurucular ile devam edelim:

Editor e = new Editor("Editor Name");
e = editorRepository.Add(e);

Project p = new Project("Project Name", e);
p = projectRepository.Add(p);

Altında, proje deposu hep geçerli sahibini (depoluyor p.EditorIdoluşturulduktan olarak proje verilerine) ve bir editörün projelerini yeniden doldurmak ancak orada olacak. Yapıcılar içine gerekli tüm özelliklere koymak için iyi bir uygulamadır nedeni budur. Eğer bütün nesneyi geçmek istemiyorsanız, sadece e.Idyapacağız.

Ben üye Editörler tembel yük istiyorlarsa, Proje yanı deposuna başvuru ihtiyacı var?

Şimdi, talep üzerine bir editörün projelerini yeniden doldurmak için nasıl olarak, size yapmak istediğimiz şeyin bağlı birkaç seçenek var. Düz Depo istediğiniz diyor ki:

IEnumerable<Project> list = projectRepository.GetAllProjects()
                                .Where(x => x.editorId == e.Id);

Ama nereye koymak için? Değil Projesi veya Editör içeride, haklısın, ya da depolara erişmek zorunda kalacak ve bu hiç iyi değil. Yukarıdaki pasajı gevşek bağlı, ama kendi başına yeniden kullanılabilir değildir. Sadece Depo Kalıbı sınırlarını ulaştık.

Yukarı Sonraki depoların paylaşılan kaynağı (birlikte uygulama için bir adaptör Katman vardır StaticServiceWrapper) ve EditorAdapter nesne çeşit (veya Agrega veya ne olursa olsun onları çağırır) ya şimdi herhangi konuşabilirsin uzatma yöntemlerinde karıştırın ve ya akıcı gerekli tüm depoları. Ben bunu bir üretim sisteminde tam olarak bu şekilde yapılması değil, ama size özlü bir örnek göstermek için:

public static class Aggregators
{
    // one to one, easy
    public static Editor GetOwner(this Project p)
    {
        return StaticServiceWrapper.editorRep.GetEditorById(p.editorId);
    }

    // one to many, medium
    public static IEnumerable<Project> GetProjects(this Editor e) 
    { 
        return StaticServiceWrapper.projectRep.GetAllProjects()
                .Where(x => x.editorId == e.Id);
    }

    // many to many, harder
    public static IEnumerable<Editor> GetMembers(this Project p)
    {
        var list = StaticServiceWrapper.projectMemberMap.GetAllMemberMaps()
                        .Where(x => x.projectId == p.projectId);

        foreach ( var item in list )
            yield return StaticServiceWrapper.editorRep.GetEditorById(item.editorId);
    }
}

Temel olarak, bir kez senin getAll, GetById, yalnız dernek bırakmak lazım, Nesne Veri Havuzu yapılır çıkarın ve Adaptörleri ve cache ve İş Logic (gibi eğlenceli kısımlarına nesne / katman hiyerarşisinde yukarı hareket, Update ekle "Ah , aman!" ).

Cevap 14/05/2009 saat 03:40
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more