Przedmowa
Mam nadzieję, że jest to oczywiste, ale ... w sugerowanych nazw poniżej, należy wymienić MyCompany
i MyProject
z rzeczywistymi nazwami firmy i projektu.
DTO
Poleciłbym stosowanie tych samych klas DTO na wszystkich warstwach. W ten sposób mniej punktów konserwacji. Zazwyczaj umieszczam je pod MyCompany.MyProject.Models
przestrzenią nazw, w ich własnym projekcie VS o tej samej nazwie. I zazwyczaj nazywam je po prostu bytem z prawdziwego świata, który reprezentują. (Najlepiej, jeśli tabele bazy danych również używają tych samych nazw, ale czasem sensowne jest ustawienie tam schematu nieco inaczej).
Przykłady: Person
, Address
,Product
Zależności: Brak (inne niż standardowe biblioteki .NET lub biblioteki pomocnicze)
DAL
Osobiście preferuję tutaj zestaw klas DAL jeden do jednego pasujący do klas DTO, ale w MyCompany.MyProject.DataAccess
przestrzeni nazw / projekcie. Nazwy klas tutaj kończą się Engine
przyrostkiem, aby uniknąć konfliktów. (Jeśli nie podoba ci się ten termin, DataAccess
sufiks też by działał. Po prostu zachowaj spójność z tym, co wybierzesz.) Każda klasa zapewnia proste opcje CRUD uderzające w bazę danych, przy użyciu klas DTO dla większości parametrów wejściowych i typów zwracanych (wewnątrz rodzajowy, List
gdy występuje więcej niż jeden, np. zwrot z Find()
metody).
Przykłady: PersonEngine
, AddressEngine
,ProductEngine
Zależności: MyCompany.MyProject.Models
BAL / BLL
Także tutaj mapowanie jeden do jednego, ale w MyCompany.MyProject.Logic
przestrzeni nazw / projekcie, z klasami uzyskującymi Logic
przyrostek. To powinna być jedyna warstwa, która wywołuje DAL! Zajęcia tutaj są często zwykłym przejściem do DAL, ale jeśli i kiedy trzeba wdrożyć reguły biznesowe, jest to miejsce na to.
Przykłady: PersonLogic
, AddressLogic
,ProductLogic
Zależności: MyCompany.MyProject.Models
,MyCompany.MyProject.DataAccess
API
Jeśli istnieje warstwa interfejsu API usług internetowych, używam tego samego podejścia jeden do jednego, ale w MyCompany.MyProject.WebApi
przestrzeni nazw / projekcie, z Services
sufiksem klasy. (O ile nie korzystasz z interfejsu API sieci Web ASP.NET, w takim przypadku należy oczywiście użyć Controller
sufiksu).
Przykłady: PersonServices
, AddressServices
,ProductServices
Zależności: MyCompany.MyProject.Models
, MyCompany.MyProject.Logic
(nigdy bypass to poprzez wywołanie DAL bezpośrednio!)
Obserwacja logiki biznesowej
Wydaje się, że coraz częściej ludzie pomijają BAL / BLL i zamiast tego wdrażają logikę biznesową na jednej lub kilku innych warstwach, tam gdzie ma to sens. Jeśli to zrobisz, bądź absolutnie pewien, że (1) cały kod aplikacji przechodzi przez warstwę z logiką biznesową i (2) jest oczywiste i / lub dobrze udokumentowane, gdzie wdrożono każdą regułę biznesową. W razie wątpliwości nie próbuj tego w domu.
Ostatnia uwaga na temat architektury na poziomie przedsiębiorstwa
Jeśli jesteś w dużej firmie lub w innej sytuacji, w której te same tabele bazy danych są współużytkowane przez wiele aplikacji, zaleciłbym pozostawienie tej MyProject
części poza powyższymi przestrzeniami nazw / projektami. W ten sposób warstwy te mogą być współużytkowane przez wiele aplikacji typu front-end (a także narzędzia zakulisowe, takie jak Windows Services). Ale rób to tylko, jeśli masz silną komunikację między zespołami i dokładne automatyczne testy regresji! W przeciwnym razie zmiany jednego zespołu we wspólnym podstawowym komponencie mogą zepsuć aplikację innego zespołu.