Sposób, w jaki zadajesz pytanie (i proponujesz dwie alternatywy), jest tak, jakby jedyną obawą było to, że kierowca nadal jest ważny w momencie tworzenia samochodu.
Należy jednak obawiać się, że kierowca powiązany z kierowcą nie zostanie usunięty przed usunięciem samochodu lub przekazaniem innego kierowcy (i być może również, że kierowca nie jest przypisany do innego samochodu (jeśli domena ogranicza kierowcę tylko być powiązany z jednym samochodem)).
Sugeruję, że zamiast sprawdzania poprawności przydzielasz (co obejmuje sprawdzanie poprawności obecności). Następnie nie zezwalasz na usuwanie, gdy są jeszcze przydzielone, chroniąc w ten sposób przed wyścigiem nieaktualnych danych podczas budowy, a także przed innym problemem długoterminowym. (Należy pamiętać, że alokacja zarówno potwierdza, jak i przyznaje alokacje, i działa atomowo.)
Przy okazji, zgadzam się z @PriceJones, że powiązanie między samochodem a kierowcą jest prawdopodobnie odpowiedzialnością niezależną od samochodu lub kierowcy. Tego rodzaju powiązanie z czasem będzie się komplikować, ponieważ brzmi jak problem z planowaniem (kierowcy, samochody, przedziały czasowe / okna, zamienniki itp.). Nawet jeśli bardziej przypomina problem z rejestracją, można chcieć historycznie rejestracje, a także aktualne rejestracje. Dlatego może równie dobrze zasługiwać na własne BC.
Możesz podać schemat alokacji (taki jak wartość logiczna lub liczba referencyjna) w BC przypisanych agregatów lub w oddzielnym BC, powiedzmy, odpowiedzialnym za utworzenie powiązania między samochodem a kierowcą. Jeśli zrobisz to pierwsze, możesz zezwolić na (prawidłowe) operacje usuwania wydane dla samochodu lub kierowcy BC; jeśli zrobisz to drugie, będziesz musiał zapobiec usunięciu z BC samochodu i kierowcy, a zamiast tego wysłać je za pomocą harmonogramu skojarzenia samochodu i kierowcy.
Możesz również podzielić niektóre obowiązki związane z alokacją na BC w następujący sposób. Zarówno samochód, jak i kierowca zapewniają schemat „alokacji”, który zatwierdza i ustawia przydzielone wartości logiczne dla tego BC; gdy ich wartość logiczna przydziału jest ustawiona, BC zapobiega usuwaniu odpowiednich encji. (A system jest skonfigurowany w taki sposób, że BC samochodu i kierowcy zezwala tylko na przydział i dezalokację z harmonogramu BC skojarzenia samochodu / kierowcy)
Planowanie samochodu i kierowcy BC następnie utrzymuje kalendarz kierowców związanych z samochodem przez pewien czas / czas, teraz i w przyszłości, i powiadamia inne BC o zwolnieniu tylko przy ostatnim użyciu zaplanowanego samochodu lub kierowcy.
Jako bardziej radykalne rozwiązanie, możesz potraktować samochody BC i kierowców jako fabryki dołączające tylko historyczne dane, pozostawiając prawo własności do harmonogramu stowarzyszenia samochodów / kierowców. Samochód BC może wygenerować nowy samochód, wraz ze wszystkimi szczegółami samochodu, wraz z jego VIN. Właścicielem samochodu zajmuje się planista stowarzyszenia samochodów / kierowców. Nawet jeśli powiązanie samochód / kierowca zostanie usunięte, a sam samochód zostanie zniszczony, zapisy samochodu nadal istnieją w BC samochodu z definicji, a my możemy użyć BC samochodu do wyszukiwania danych historycznych; podczas gdy powiązania / własności samochodów / kierowców (przeszłość, teraźniejszość i potencjalnie przyszłość) są obsługiwane przez inny BC.
Driver.delete
nie powinno istnieć. Tak naprawdę nigdy nie widziałem domeny, w której agregaty ulegają zniszczeniu. Trzymając AR wokół siebie, nigdy nie skończysz z sierotami.Warto zapytać: Czy jesteś pewien, że samochody są zbudowane z kierowcami? Nigdy nie słyszałem o samochodzie złożonym z kierowcy w prawdziwym świecie. Powodem, dla którego to pytanie jest ważne, jest to, że może on skierować Cię w kierunku samodzielnego tworzenia samochodów i kierowców, a następnie stworzenia zewnętrznego mechanizmu, który przypisuje kierowcę do samochodu. Samochód może istnieć bez odniesienia do kierowcy i nadal być ważnym samochodem.
Jeśli samochód musi bezwzględnie mieć kierowcę w twoim kontekście, możesz rozważyć wzorzec konstruktora. Ten wzór będzie odpowiedzialny za zapewnienie, że samochody będą budowane z istniejącymi kierowcami. Fabryki będą obsługiwały niezależnie sprawdzone samochody i kierowców, ale konstruktor zapewni, że samochód będzie miał potrzebne referencje, zanim zacznie on obsługiwać samochód.
źródło
Chyba tak. Pobieranie danego DriverId z DB zwraca pusty zestaw, jeśli nie istnieje. Sprawdzanie wyniku zwracania powoduje, że nie jest konieczne pytanie, czy istnieje (a następnie pobieranie).
DriverId
i jest ustawiony w konstruktorze.Car
potrzebujesz tylkoDriverId
, miećDriver.Id
getter. Bez setera.Car
to obchodzi, jeśli ma onDriver
(lub jego identyfikator przynajmniej). ADriver
to obchodzi, jeśli to maDriverId
. DoRepository
dba o integralność danych i nie obchodzi o samochodach kierowców mniej.DriverId
jest domeną biznesową, jest obsługiwany w odpowiednich klasach.... dzieje się, gdy
Repository.DriverIdExists()
zadaje pytanie.Zbuduj obiekt domeny. Jeśli nie,
Driver
to może obiektDriverInfo
(tylkoDriverId
aName
, powiedzmy).DriverId
Jest sprawdzany na budowie. Musi istnieć, być odpowiednim typem i cokolwiek innego. Następnie jest kwestią projektu klasy klienta, jak radzić sobie z nieistniejącym sterownikiem / driverId.Może
Car
bez kierowcy nie ma problemu, dopóki nie zadzwoniszCar.Drive()
. W takim przypadkuCar
obiekt oczywiście zapewnia swój własny stan. Nie można prowadzić bezDriver
- no, jeszcze nie całkiem.Jasne,
Car.DriverId
jeśli chcesz. Ale powinno to wyglądać mniej więcej tak:Nie to:
Teraz
Car
muszą poradzić sobie ze wszystkimiDriverId
kwestiami dotyczącymi ważności - naruszenie zasady jednej odpowiedzialności; i prawdopodobnie nadmiarowy kod.źródło