Projektuję system, który ma prosty obiekt domeny wspieranej przez Entity Framework, który ma pola, które muszę aktualizować w oparciu o szereg reguł - chcę je wdrożyć rządzi progresywnie (w stylu zwinnym) i jak używam EF, sceptycznie podchodzę do umieszczania każdej reguły w obiekcie domeny. Jednak chcę uniknąć pisania "kodu proceduralnego" i używania anemicznych modeli domen. To wszystko musi być również testowalne.Jak uniknąć anemicznego modelu domenowego z logiką biznesową w postaci reguł
Jako przykład, obiekt jest:
class Employee {
private string Name;
private float Salary;
private float PensionPot;
private bool _pension;
private bool _eligibleForPension;
}
muszę zbudować reguły takie jak „jeśli wynagrodzenie jest wyższe niż 100000 i _eligibleForPension jest fałszywa wtedy ustawić _eligibleForPension jako prawdziwy” i „jeśli _pension jest prawdziwe wtedy ustaw _eligibleForPension jako true ".
Istnieje około 20 takich zasad i szukam porady, czy powinny być one wdrożone w klasie pracownika lub w czymś podobnym do klasy EmployeeRules? Moją pierwszą myślą było stworzenie oddzielnej klasy dla każdej reguły dziedziczącej po "Regule", a następnie zastosowanie każdej reguły do klasy Employee, być może przy użyciu wzorca Visitor, ale musiałem ujawnić wszystkie pola regułom, aby to zrobić, aby czuje się źle. Posiadanie każdej reguły na poziomie pracownika również nie jest odpowiednie. W jaki sposób zostanie to wdrożone?
Drugą sprawą jest to, że faktyczni Pracownicy to jednostki Entity Framework, które wspierają DB, więc nie czuję się szczęśliwy dodając logikę do tych "Entities" - szczególnie, gdy muszę kpić z obiektów, testując każdą regułę. Jak mogłem ich wyśmiewać, jeśli mają zasady, które testuję na tym samym obiekcie?
Zastanawiam się, czy użyć AutoMappera, aby przekonwertować na prostszy obiekt domeny przed zastosowaniem reguł, ale następnie samodzielnie zarządzać aktualizacjami w tych polach. Wszelkie porady na ten temat też?
To wygląda jak by to zrobić sztuczka. Chociaż podałem przykład z prywatnymi polami, co jest moim pożądanym projektem, EF ma właściwości publiczne, więc nie musiałbym używać klas wewnętrznych, jeśli uzyskałem bezpośredni dostęp do klasy Pracownicy. Mam zamiar pozostawić pytanie otwarte na trochę w nadziei, że ktoś może odpowiedzieć na pytanie, w tym części EF. Dzięki! – PCurd
Zbudowałem model demonstracyjny systemu, stosując nieco zmodyfikowane podejście - nie mam reguł jako klas wewnętrznych - i działa dobrze. Wiem dla tego systemu, że publiczne udostępnienie pól nie jest straszną zbrodnią, ale mógłbym spróbować ponownie używając wewnętrznych klas, aby zobaczyć jak to działa. Dzięki za pomoc. – PCurd