Kiedy używa się obiektów biznesowych wielokrotnego użytku, co uważa się za najlepszą praktykę przy budowaniu modeli widoków?
Używamy obiektu, który nazywamy, Builder
do budowy naszych modeli widoków. Jeden konstruktor dla każdej logicznej jednostki widoków (zamówienia, użytkownicy itp.), Przy czym każda jednostka może zawierać wiele różnych modeli widoków (zamówienia zawierają podsumowanie, wiersze zamówień itp.).
Konstruktor może pobierać dane przez jeden lub więcej standardowych obiektów biznesowych w celu zbudowania modelu widoku.
Jaka jest najlepsza praktyka, jeśli chodzi o stosowanie obiektów / modeli biznesowych w modelach widoku?
Podejście 1
Zezwolić na użycie obiektów biznesowych w modelu widoku?
//Business object in some library
public class Order
{
public int OrderNum;
public int NumOrderLines;
//...
}
//Order builder in website
public class OrderBuilder
{
public OrderSummary BuildSummaryForOrder(int OrderNum)
{
Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum);
//Any exception handling, additional logic, or whatever
OrderSummary obModel = new OrderSummary();
obModel.Order = obOrder;
return obModel;
}
}
//View model
public class OrderSummary
{
public Some.Business.Logic.Order Order;
//Other methods for additional logic based on the order
//and other properties
}
Podejście 2
Pobieraj tylko niezbędne dane z obiektów biznesowych
//Business object in some library
public class Order
{
public int OrderNum;
public int NumOrderLines;
//...
}
//Order builder in website
public class OrderBuilder
{
public OrderSummary BuildSummaryForOrder(int OrderNum)
{
Some.Business.Logic.Order obOrder = Some.Business.Logic.GetOrder(OrderNum);
//Any exception handling, additional logic, or whatever
OrderSummary obModel = new OrderSummary()
{
OrderNum = obOrder.OrderNum,
NumOrderLnes = obOrder.NumOrderLines,
}
return obModel;
}
}
//View model
public class OrderSummary
{
public int OrderNum;
public int NumOrderLines
//Other methods for additional logic based on the order
//and other properties
}
Widzę zalety i wady obu, ale zastanawiam się, czy istnieje zaakceptowane podejście? W podejściu 1 nie występuje powielanie kodu wokół modeli, ale tworzy zależność od logiki biznesowej. W podejściu 2 pobierasz tylko dane potrzebne do widoku, ale kopiujesz kod wokół modeli.
źródło
Opcja 1 jest preferowana, ponieważ pozwala uniknąć duplikacji kodu. Otóż to.
Jeśli model domeny zmieni się znacząco, jest prawie pewne, że widok i tak będzie musiał się zmienić. W przypadku opcji 2 musisz zmienić model widoku ORAZ konstruktora, a także sam widok. Tego rodzaju rzeczy są absolutną trucizną za łatwość utrzymania. YAGNI.
Istotą posiadania osobnego modelu widoku jest utrzymanie stanu, który ma znaczenie tylko dla widoku (np. Która karta jest aktualnie wybrana), odrębnego od modelu biznesowego. Ale same dane biznesowe powinny być ponownie wykorzystywane, a nie duplikowane.
źródło
Zasady i mantry są czasem cenne przy projektowaniu przewodnim ... ale oto moja praktyczna odpowiedź:
Wyobraź sobie, że twoje modele widoków są serializowane do JSON lub XML. Jeśli spróbujesz serializować swoje modele domen, skończysz z ohydnym bałaganem tekstu i najprawdopodobniej napotkasz problemy z okólnikami i innymi problemami.
Celem modelu widoku nie jest grupowanie modeli domen, aby widok mógł je wykorzystać. Zamiast tego model widoku powinien być całkowicie płaskim modelem widoku ... rzeczywistą rzeczą, na którą patrzysz na ekranie. Twoja logika widoku powinna dotyczyć tylko strukturyzacji danych obecnych w modelu widoku.
Idealnie twój model widoku powinien składać się prawie całkowicie ze wstępnie sformatowanych ciągów. Pomyśl o tym ... nie chcesz nawet DateTime ani wartości dziesiętnych w modelu widoku, ponieważ utkniesz w logice formatowania w C #, JavaScript, Objective-C itp.
źródło