Rozwijam projekt podobny do korporacyjnego za pomocą wzoru DDD. Mam następujące projekty w moim C# rozwiązanie:Jak prawidłowo zdefiniować strategię wyjątków w aplikacji korporacyjnej .NET ze wzorcem DDD?
modelu domeny - projekt DLL
WebUI - ASP.NET projekt MVC3
DesktopUI - projekt WPF
DAL - Entity Kod ramy Pierwszy
Trwałość - SQL Server Database
Ten projekt nie jest duży, ale staram się używać wszystkich dobrych praktyk aplikacji korporacyjnych.
Co chciałbym zdefiniować teraz jest strategia wyjątek, ale nie jestem pewien, jak podejść do tego. Prawdopodobnie powinienem używać funkcji obsługi wyjątków biblioteki korporacyjnej i rejestrowania bloków, ale nie jestem pewien, jak to dopasować do obrazu. Niektóre konkretne scenariusze Próbuję rozwiązać w głowie są następujące:
Jeżeli nowy podmiot jest tworzony przez użytkownika w aplikacji WPF i przycisk Zapisz kliknięciu jak powinien Błąd być zgłaszane i rejestrowane w przypadku, gdy wyjątek występuje na różnych poziomach (np. encja nie została poprawnie utworzona zgodnie z regułami domeny lub wystąpił błąd podczas próby utrzymania nowego obiektu w bazie danych)
Użytkownik próbuje odzyskać nieznaną jednostkę z bazy danych (np. z WebUI, określając nieznany podmiot Id w adresie URL)
Rozumiem, że mogę zdefiniować niestandardowe wyjątki, ale nie jestem do końca pewien, gdzie i jak. Czy należy je zdefiniować na każdą warstwę? Wiem, że jest zawijanie praktyki wyjątków, ale znowu nie jestem pewien, jak najlepiej użyć tego wzoru.
Należy również utworzyć jeden niestandardowy wyjątek dla każdego błędu w niektórych warstwach (np. UserAlreadyExistInDatabaseException dla próby zapisania dwóch użytkowników z tym samym adresem e-mail i UnknownUserDatabaseException, jeśli próbuję uzyskać nieznanego użytkownika z bazy danych) lub powinienem mieć jeden wyjątek obsługuje błędy wielowarstwowe (np. DatabaseException, a następnie rozróżnia błędy z właściwością niestandardową lub właściwością Exception.Message).
Stwierdziłeś: "Usługa aplikacji zawiera enkapsulację Twojej domeny, w tym model domeny". Dlatego interfejs użytkownika może uzyskać dostęp do typu 'UserAlreadyExistInDatabaseException', ponieważ jest on zawarty w nim. Ale jeśli podzielimy usługi aplikacji na applicationservice-api.jar (interfejsy, DTO itd.) I applicationservice-impl.jar. Tylko applicationservice-impl.jar miałby dostęp do 'UserAlreadyExistInDatabaseException'. Tak więc interfejs w zależności tylko od applicationservice-api.jar (decoupling) nie może działać zgodnie z tym wyjątkiem ... O czym myślisz? – Mik378