2011-01-26 25 views
5

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?

cevap

2

Endişelerinizin sonuna doğru özetlediğiniz şeyleri ve iş katmanı grubundaki şeyleri, iş açısından daha mantıklı bir şekilde yapan yöneticilere yöneliyorum. örneğin

kullanarak İletişim, kesinlikle bir PhoneManager veya EmailManager olmazdı. "ContactsManager" benim için daha kullanışlı bir gruplamadır, aynı şeyi sadece daha az sayıda yönetici ile başa çıkarak gerçekleştirir. İş açısından bakıldığında, telefon numaraları ve e-postalar zaten bir İletişimin küçük parçalarıdır. Sadece kendi tabloları ve varlıkları olduğu için kendi yöneticilerine ihtiyaçları olduğu anlamına gelmez. Bu onları tekrar kullanamayacağınız anlamına gelmez.Çeşitli yerlerde e-posta adresleriyle çalışmanız gerekirse, ContactsManager ilgili yöntemlere sahip olabilir.

Ortamımızda sahip olma eğilimi, bir veri tabanı/varlık katmanı, ardından sunucu üzerinde oturan ve iş kurallarını ve iş mantığını işleyen bir iş katmanıdır. Bu iş katmanı, müşteriye WCF üzerinden bir hizmet olarak (veya en azından müşteriyle ilgili olan şeyler) bir hizmet olarak açığa çıkar.

Ne yapmak istediğinizi zaten biliyormuşsunuz gibi geliyor, bu yüzden üzerinde biraz prototip çalışması yapmayı ve sizin için nasıl çalıştığını görmeyi öneririm. :)

+0

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

+0

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

+0

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