2012-06-25 11 views
5

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).

Odpowiedz

6

chciałbym zatrzymać się z dala od obsługi wyjątków i rejestrowania bloków EntLib ponieważ są one po prostu zbyt skomplikowane, aby skonfigurować i zajmować się w ogóle. Z pewnością możesz je zbadać, aby zobaczyć, jak można podejść do tego typu problemów, ale często łatwiej jest przetasować własne rozwiązanie lub użyć log4net lub NLog do logowania.

miarę obsługi wyjątków, warstwa prezentacji (WPF lub ASP.NET) powinien złapać i interpretowania wyjątków zgłaszanych przez warstwę usług aplikacyjnych. Usługa aplikacji zawiera enkapsulację Twojej domeny, w tym model domeny i warstwę dostępu do danych (repozytoria w DDD mówią). Usługa aplikacji może zwracać obiekty wynikowe, które mogą zawierać informacje o błędach lub propagować wyjątki z domeny lub DAL.

Należy utworzyć niestandardowe typy wyjątków, jeśli zamierzają je złapać, żeby zrobić coś konkretnego z danego rodzaju wyjątku.Wyjątek taki jak UserAlreadyExistInDatabaseException może być przydatny, ponieważ usługa aplikacji może go przechwycić i zwrócić obiekt wynikowy, który zostanie zinterpretowany przez warstwę prezentacji, lub wyjątek może zostać przechwycony w warstwie prezentacji, która z kolei poinformuje użytkownika.

Rejestrowanie można wykonać w warstwie usługi aplikacji lub w warstwie prezentacji lub w obu. Na przykład usługa aplikacji może wychwycić wyjątek z DAL, zarejestrować go i zawinąć w inny wyjątek interpretowany przez warstwę prezentacji.

użytkownik próbuje odzyskać nieznany podmiot z bazy

ten może być obsługiwany na kilka sposobów. Jednym ze sposobów jest to, że usługa aplikacji zwraca zerowe odwołanie, a warstwa prezentacji zwraca odpowiedni komunikat do użytkownika. Alternatywnie, DAL może wywołać coś podobnego do EntityNotFoundException, który może zostać przechwycony w warstwie prezentacji, zwracając również odpowiednią wiadomość do użytkownika. Podniesienie takiego wyjątku może być korzystne dla czegoś takiego jak ASP.NET MVC, ponieważ można utworzyć filtr akcji, który zwraca ogólną odpowiedź po otrzymaniu wyjątku wspomnianego typu.

+0

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

Powiązane problemy