Mam aplikację internetową. Nie wierzę, że technologia jest ważna. Struktura jest aplikacją na poziomie N, pokazaną na obrazku po lewej stronie. Istnieją 3 warstwy.
Interfejs użytkownika (wzorzec MVC), warstwa logiki biznesowej (BLL) i warstwa dostępu do danych (DAL)
Mam problem z tym, że moja BLL jest ogromna, ponieważ ma logikę i ścieżki w wywołaniu zdarzeń aplikacji.
Typowy przepływ przez aplikację może być:
Zdarzenie uruchomione w interfejsie użytkownika, przejdź do metody w BLL, wykonaj logikę (być może w wielu częściach BLL), ostatecznie do DAL, z powrotem do BLL (gdzie prawdopodobnie więcej logiki), a następnie zwróć pewną wartość do interfejsu użytkownika.
BLL w tym przykładzie jest bardzo zajęty i zastanawiam się, jak to rozdzielić. Mam też logikę i obiekty, które mi się nie podobają.
Wersja po prawej to mój wysiłek.
Logika jest nadal jak płynie wniosek między UI i DAL, ale są prawdopodobnie nie ma właściwości ... Tylko metody (większość klas w tej warstwie mogłoby ewentualnie być statyczny, ponieważ nie przechowuje żadnych stanu). Warstwa Poco to miejsce, w którym istnieją klasy, które mają właściwości (takie jak klasa Person, w której będzie imię, wiek, wzrost itp.). Nie miałyby one nic wspólnego z przepływem aplikacji, tylko przechowują stan.
Przepływ może być:
Nawet wyzwolony z interfejsu użytkownika i przekazuje niektóre dane do kontrolera warstwy interfejsu użytkownika (MVC). To tłumaczy nieprzetworzone dane i konwertuje je na model poco. Model poco jest następnie przekazywany do warstwy logicznej (która była BLL) i ostatecznie do warstwy zapytania, potencjalnie manipulowanej po drodze. Warstwa zapytania Command przekształca POCO w obiekt bazy danych (które są prawie takie same, ale jeden jest przeznaczony do trwałości, a drugi do interfejsu użytkownika). Element zostanie zapisany, a obiekt bazy danych zostanie zwrócony do warstwy zapytania. Następnie jest konwertowany na POCO, gdzie wraca do warstwy logicznej, potencjalnie przetwarzany dalej, a następnie z powrotem do interfejsu użytkownika
Wspólna logika i interfejsy to miejsce, w którym możemy mieć trwałe dane, takie jak MaxNumberOf_X i TotalAllowed_X i wszystkie interfejsy.
Zarówno wspólna logika / interfejsy, jak i DAL są „podstawą” architektury. Nic nie wiedzą o świecie zewnętrznym.
Wszystko wie o poco innych niż wspólna logika / interfejsy i DAL.
Przepływ jest nadal bardzo podobny do pierwszego przykładu, ale sprawia, że każda warstwa jest bardziej odpowiedzialna za 1 rzecz (czy to stan, przepływ, czy cokolwiek innego) ... ale czy łamie OOP przy takim podejściu?
Przykładem demonstracji Logiki i Poco może być:
public class LogicClass
{
private ICommandQueryObject cmdQuery;
public PocoA Method1(PocoB pocoB)
{
return cmdQuery.Save(pocoB);
}
/*This has no state objects, only ways to communicate with other
layers such as the cmdQuery. Everything else is just function
calls to allow flow via the program */
public PocoA Method2(PocoB pocoB)
{
pocoB.UpdateState("world");
return Method1(pocoB);
}
}
public struct PocoX
{
public string DataA {get;set;}
public int DataB {get;set;}
public int DataC {get;set;}
/*This simply returns something that is part of this class.
Everything is self-contained to this class. It doesn't call
trying to directly communicate with databases etc*/
public int GetValue()
{
return DataB * DataC;
}
/*This simply sets something that is part of this class.
Everything is self-contained to this class.
It doesn't call trying to directly communicate with databases etc*/
public void UpdateState(string input)
{
DataA += input;
}
}