MVVM, DDD ve WPF Katmanlı Uygulama Proje Yapısı Kılavuzu


17

VS benim uygulama yapısını kurmaya çalışıyorum ve ben "denemek" ve makul bir seviyeye gelecekteki kanıtı istiyorum. Bu uygulama hiçbir sözleşme izlememiş eski bir Winform app WPF yeniden yazma olacak. Katmanlar, Katmanlar, Kısaltmalar vb.

Oldukça büyük bir Kurumsal Uygulamadır. DB'lerim gibi Linq To SQL kullanmayı planladım ve büyük olasılıkla her zaman MS SQL olacak. Ayrıca mevcut bir yetenek setim var.

MVVM ve DDD'yi elimden gelenin en iyisini takip etmek istiyorum ama bunları birleştirirken uygulamamın yapısı hakkında kafam karışıyor. Bazı örneklerle açıklayayım.

MVVM'yi izlediğimde klasör yapım şöyle görünebilir:

Views
Models
ViewModels
Helpers

ancak bu, Proje Yapım'ın buna benzeyebileceği basit bir DDD katmanlı yaklaşıma nasıl uyar:

MyApp.UI
MyApp.Domain
MyApp.Data

ModelsEtki Alanı katmanına koyabilir miyim yoksa 3 sürümüm var Personmı? Bu, DB Nesnemi Depom ve eşlemelerimi Etki Alanı Nesnesine nereye koyacağım konusunda başka bir soruya neden olur? Verileri varsayacağım ...

ViewsBen UI gitmek istiyorum ama aynı ViewModelszamanda?

Son olarak, İş Mantığımı nereye yerleştireceğim?

Aşağıdaki CodePlex, DDD örneği bulundu ve bazı yardım oldu ama bu önemli olmayabilir ve benim cehalet aracılığıyla parlayan olsa da bir Web uygulaması gibi görünüyor.

Beni yanlış anlamayın, istediğim kadar çok klasöre sahip olabileceğimi ve onları arayabileceğimi biliyorum. Bir şeyleri nereye yerleştireceğimizi anlamaya çalışıyorum, böylece bu yerlere mutlaka denilen şey değil, ölçeklenebilir olacak.

Sorumun kalbi şu şekilde gösterilebilir. Tarafından oluşturulan nesne
var . Bu açıktır ve "Veri" katmanıma aittir. Şimdi Model, DTO, Etki Alanı Modeli ya da adı verilen ayrı bir Katmanda (proje?) Denir . Bir gerekir için için nerede koymak için emin değilim. Sonra, bir ViewModel için, diyelim ki, o çeker ama muhtemelen daha kendi özellikleri vardır . Sonunda o ViewModel bağlı bir görünüm olurdu ....tblPerson*.dbml
PersonMapperPersontblPerson
EditPersonPerson

Paragrafın varsayımlarım ve tahminlerimle doldurulduğunu ve birisinin benim için havayı temizlemesine veya orada içgörüler sunmasını umuyorum, böylece 6 aydan bir yıla kadar kendimi ihtiyacımdan daha fazla tekmelemiyorum.


Linq To SQL daha büyük projeler için uygun değildir. Entity Framework ya da nHibernate gibi farklı bir ORM kullanın. Ayrıca, bu yalnızca istemci uygulaması mı yoksa istemci sunucusu mu?
Euphoric

WPF Yalnızca İstemci uygulamasıdır. Ayrıca, tek veri kaynağım MS SQL olduğunda L2S'nin orta veya daha büyük boyutlu bir uygulama için neden uygun olmadığını düşündünüz mü?
Refrakte Paladin

Yanıtlar:


5

MVVM bir kullanıcı arayüzü modelidir ve bir istemcide kullanılır.

Alan adının DDD'de istemcide kullanılan bölümleri muhtemelen Modelin (bir parçasıdır)

View ve ViewModel yalnızca istemcidir.

Modeli arka uca senkronize ettikleri için Depoları Modelin içine (veya yakınına) koydum.

Evet, bu birçok kez farklı ad alanlarında birden fazla Kişi sınıfıyla sonuçlanır. Çok benzer şekilde başlayabilirler, ancak birkaç yineleme veya sürümden sonra çok farklı olabilirler.

DÜZENLE

Depolar ile ilgili bölümün açıklığa kavuşturulması ve İş Mantığının konumlandırılması hakkında daha fazla açıklama

Ayrı bir istemci ve sunucu tarafı / arka uç içeren bir sistem oluşturuyorsanız Depolar istemci ve sunucuda kullanılabilir. İstemcide sunucu (lar) ın bir soyutlamasını sağlamak ve sunucuda diğer sunucuların ve veri kaynaklarının bir soyutlamasını sağlamak. Bu sadece bir model.

İş kurallarına gelince: istemcide bunları kullanıyorsanız, bunları sunucuda da uyguladığınızdan emin olun. Asla bir müşteriye güvenme. İstemcideki iş kuralları hızlı giriş doğrulamasına izin verir ve sunucuya gidiş gelişleri önler.

Ben DDD sunucu tarafında ait olduğunu ve istemciye 'sızıntıları' olduğunu düşünüyorum.


2

WPF uygulaması için MVVM tasarım modelini seçerken doğru yöne sahipsiniz .

Do I put the Models in the Domain layer?

Evet, modelleriniz alan adına yerleştirilebilir

Where would I put my Repository and mappings of DB Object to Domain Object?

Depolarınız, Etki Alanınızın yerleştirildiği katmana yerleştirilebilir. Eşleme nesneleriniz (DTO'lar - etki alanı aktarım nesneleri olarak da adlandırılır) hizmet katmanınıza yerleştirilmelidir ve etki alanı nesnelerinizi DTO'larla kolayca eşleştirmek için güçlü bir eşleme aracı AutoMapper kullanabilirsiniz.

ViewModels also?

ViewModels'ınız istemci tarafınıza (katman) yerleştirilmelidir. Görünüm modellerinizi, görünümlerinize bağlı olarak bir veya daha fazla DTO'dan oluşturabilirsiniz.

DDD ile ilgili olarak , bu konuyu okumanızı ve gerçekten Etki Alanına Dayalı Tasarım desenine sahip olmanızı açıklamanızı öneririm. tüm yazılım uygulamalarının% 95'inin “DDD kullanmak için çok iyi değil” kategorilerine girdiği bir tartışma .

Düzenleme: referans yukarıda eklenmiştir ve teşekkürler @Den için gidin!


Lütfen, oylama yaparken yorum yapın.
Yusubov

1
DDD fanboyları her yerde kullanmak istiyor. İlgili bağlantı: stackoverflow.com/questions/810606/is-ddd-a-waste-of-time
Den

@Den, bağlantı için teşekkürler! Onu aramayı planlıyordum.
Yusubov

1

Nereye gittiğini araştırmadan önce, her katmanın ne yapması gerektiği hakkında konuşalım.

MVVM'nin satış noktası, görünüm ve görünüm modeli arasındaki bağdır. Buradaki amaç görünümdeki mantığı ortadan kaldırmaktır.
Görünüm gibi Model de oldukça hafif olmalı ve yalnızca görünüm modelinin çalışması için gerekli olan bilgilere (verilere) erişmek için kullanılmalıdır. Model, farklı veri kaynaklarına erişimi karıştırabilir, ancak iş mantığına sahip olmamalıdır. Çoğu durumda, tek bir veri deponuz olur. Bazı durumlarda yapmazsınız. Yapmadığınızda, VM'deki verilerin kaynağını gizlemek için Modeli kullanmak uygundur.

MVVM'nin örtük bir noktası, verilerin önceden depolanmış olması ve projenizin, kuruluşunu korumaktan sorumlu olmamasıdır. Bazı projeler bu varsayımdan kurtulabilecek kadar şanslı, üzerinde çalıştığım projelerin çoğu o kadar şanslı değildi. Verilerin uğraşmamız gereken başka bir katman olduğunu söylemek yeterli.

Projemi şöyle düzenlerdim:

 project.Views
 project.ViewModel
 project.Model
 project.DataStructs

ve bu katman gerektiğinde eklenebilir:

 project.Helpers

Yardımcıları yığının geri kalanından ayırıyorum, böylece uygulama yığınınızın bir katmanı olarak karıştırılmıyor.

Feragatname: Ben bir DDD uzmanı değilim, ama genel özeti anlıyorum ve yaklaşımdaki değeri görüyorum.

Kişisel Alan Düşündüğünüz o soru seti olacak. Alan Modelleri oluşturup buna ViewModels öncelikle karşılık olacak; Görünümler içinde biraz; ve Model / DataStructs içinde küçük bir yığın.

Peki bu nasıl olacak?
EĞER varolan veri yapılarını yukarı değiştirme yeteneğine sahip, ardından oluşturmak yenileri çözmeye çalışıyoruz sorununa ilişkili olmalıdır. Müşteri nesneniz mi var? O zaman Müşteri ile ilgili bazı tablolarınız olmalıdır. Faturalarınız veya ürünleriniz mi var? Aynı hikaye - bu iş nesnelerine uyan tablolar ve yapılar oluşturulmalıdır.

Etki Alanı, ViewModel nesneleriniz ve bu nesnelerde sunduğunuz Görünümler aracılığıyla ifade edilir. Müşteri kayıtlarını düzenlemeniz gerekiyorsa, bu görevi gerçekleştirmek için bir VM'ye sahip olursunuz.

Sorularınız için:

  1. DDD'yi MVVM üzerine yerleştirmeye çalışmayın. Sadece işe yaramayacak. DDD bir düzen kalıbı değil, genel sorununuzu görüntüleme yaklaşımıdır.
  2. Depo ve Eşlemeler ya project.Data ya da project'de yaşayacaktır.
  3. Project demek istediğiniz sürece UI adlı bir katmanınız yok.
  4. Business Logic, View-Model'e gidecek.

1
Tamam, muhtemelen cahil bazı soruları takip edin. (1) bunların her birini ayrı bir proje mi yoksa sadece klasörler mi (örn. Project.View vb.)? (2) DataStructs, * .dbml veya Project.Data'yı nereye koyacağınızdır? (3) Yani, sizce, bir Projem olmazdı. Birkaç kez kullandığımın neden sorduğumu gördüm.
Refrakte Paladin

@RefractedPaladin - 1) sadece proje içindeki klasörler. Verilerin kendi projesi olması gerektiğini savunabilirsiniz. Bakım açısından bakıldığında, her iki şekilde de eşdeğerdir. 2) evet, kesinlikle. 3) hayır, .Domain klasörüm olmazdı. IMO, bizim işimiz uygulamayı iş problemi alanıyla eşleştirmek. Böylece Etki Alanı projenin tüm katmanlarına nüfuz eder.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.