Bizim n-katmanlı mimarisi yeniden değerlendirmek çalışıyorum ve deneyimlerinizi dayalı bazı öneriler almak isteriz n-katmanı. İşte bizim tipik .NET n-layer (bazen n-tier) tasarımımız.iş/hizmet katman tasarımı
Project.UI
Project.Services
Project.Business
Project.Model
Project.DataAccess
DataAccess tipik Entity Framework 4
ve Repository
sınıfları içerir. Tablo için bir depoya sahip olmaktan kaçınmak için Aggregate Root
konseptini takip etmeye çalışıyorum, deneyimimden daha kolay. Depolar ve Tablolar arasında% 70'lik bir eşleşme eğilimi var.
Modeli genellikle benim Entity Framework 4
varlıkları oluşur, ben başarı ile Öz-Takip EF varlıkları kullanıyorum.
İş çoğu ile mücadele budur. Ben genellikle her Repository
için Manager
sınıf var. Bu sınıf, repository.Add() öğesine yönlendirmeden önce iş doğrulaması gerçekleştirecek .Add() gibi yöntemleri içerir. aslında bir web servisi tabanlı bir çözüm oluşturmak için arıyorum eğer
Hizmetleri, genellikle sadece bu uygulayacak. Bu katman, DTO'lar ve varlıklar arasındaki marshaling istekleri/yanıtları ile görevlendirilecektir. Ve en önemlisi daha fazla coarse grained
arayüzü sağlar. Örneğin AccountManager.ValidateCash(), OrderManager.SubmitOrder() da yer alabilir bir ticari işlem için gerçekten facade
bir TradingService.SubmitTrade(), vb
İşim tabakası çok varlıktır Endişeler merkezli, gerçekten sadece varlıklar arasında validasyon ile varlıklar ve depo arasındaki yapıştırıcı. Hizmet Katmanının depolara referans teşkil eden (özünde "iş katmanını" atlayan) olduğu birçok tasarım gördüm. Özünde, İş katmanım ile aynı amaca hizmet eder, doğrulama yapar, ancak bunun sorumluluğu (ve isimlendirmesi) daha yüksek, daha kaba taneli bir ticari işlemdir. Yukarıdaki örneği kullanarak TradingService.submitTrade(), herhangi bir işletme yöneticisi sınıfına delege etmeyecektir, kendisi gerekli depoları sorgulayacaktır, tüm doğrulama işlemini gerçekleştirecektir.
Tasarımımı bir işi yeniden kullanabileceğim bir şekilde beğeniyorum Birden çok hizmet çağrısında katman yöntemi, ancak ben her depo için eşleşen bir iş katmanı yöneticisi var, ekstra çalışma tonu yaratıyor olmasından nefret ediyorum. Belki de çözüm, İş Katmanı düzeyinde farklı bir gruplandırmadır? Örneğin, PhoneManager ve EmailManager gibi bireysel Yönetici sınıflarını (Phone varlıkları ve E-posta varlıklarım var) ContactsManager gibi bir mantıksal Yönetici sınıfına birleştirin (not "İletişim" varlık tipim yok). ContactManager.GetPhones() ve ContactManager.GetEmail(), vb. Gibi yöntemlerle, Hizmet katmanına, İş katmanına, her ikisine vb. Sahip olup olmadıklarına bakılmaksızın, diğerlerinin sorumluluklarını nasıl organize edip delege ettiklerini merak ettiğim her şeyden çok daha fazlasını tahmin ediyorum. ORM bağlam referansı, vb. Neyi içerir?
Birden çok işletme yöneticisi sınıfını kapsayan bir servis çağrınız var mı? Başka bir deyişle, servis arayüzünüz işletme yöneticilerinden daha kaba tanecikli olabilir. Örneğin, ContactService.CreateUser(), UserManager.CreateUser() ve ContactManager.AddEmail() ve ContactManager.AddPhone(), vb. Için temsilci (bir cepheye hizmet eder). Ayrıca E-posta ve Telefonla ilgili mantığı ContactsManager'a gruplandırmış olsak da , PhoneRepository ve EmailRepository sahip olmanın yanlış bir şey yoktur. Bana öyle geliyor ki Depolar Yöneticiler gibi “mantıklı” olamazlar. – e36M3
Nadiren, ama oldu. İş katmanındaki mantığı olabildiğince yüksek tutmayı tercih ederim çünkü bu, birileri bana daha sonra gelirse ve aynı şeyleri yapan bir web sayfası istiyorsa bunu sağlar (ve evet, olur). Web sayfası, hizmeti çağırmak yerine servisin yaptığı aynı iş katmanı mantığını çağırabilir (benim durumumda aynı sunucudadır). Yani böyle bir durumda ne yapacağım, diğer işletme yöneticilerini kullanabilecek bir işletme yöneticisi yöntemine sahip. Bununla birlikte, basitlikte gerçek bir kazanç olduğunda, bundan kaçınmaya çalışıyorum. – Tridus
Neyi kastettiğimi biliyorum, yöneticilerimi kurucular aracılığıyla gerekli depoları sağlamak için Yöneticilerimi oluşturmak için kullanıyorum. Başka bir Yönetici oluşturma Yöneticisi Yöneticilerin DI kabının farkında olmasını gerektirir. Ancak bu olmadan bazen kopyalayıp yapıştırarak mantığı kopyaladığım görülüyor. Örneğin DataEntryManager.EnterPrice() ve FileManager.UploadPriceFile(). Söz konusu "fiyat dosyasını" ayrıştırdıktan sonra fiyatları eklememiz gerektiğini düşünebilirsiniz. Bu mantığın bazılarını çoğaltabilir veya FileManager'ın DataEntryManager'ı yeniden kullanmasını sağlayabilirim. – e36M3