5

DDD パターンを使用してエンタープライズのようなプロジェクトを開発しています。C# ソリューションには次のプロジェクトがあります。

  • ドメイン モデル - DLL プロジェクト

  • WebUI - ASP.NET MVC3 プロジェクト

  • DesktopUI - WPF プロジェクト

  • DAL - エンティティ フレームワーク コード ファースト

  • 持続性 - SQL Server データベース

このプロジェクトは大規模ではありませんが、エンタープライズ アプリケーションのすべての優れたプラクティスを使用しようとしています。

今定義したいのは例外戦略ですが、それにアプローチする方法がわかりません。おそらく Enterprise Library Exception Handling と Logging Blocks を使用する必要がありますが、それをどのように図に収めればよいかわかりません。私が頭の中で解決しようとしているいくつかの具体的なシナリオは次のとおりです。

  • 新しいエンティティが WPF アプリケーションでユーザーによって作成され、[保存] ボタンがクリックされた場合、さまざまなレベルで例外が発生した場合にエラーを報告してログに記録する方法 (たとえば、エンティティがドメイン ルールに従って適切に作成されていない、または新しいオブジェクトをデータベースに永続化しようとしてエラーが発生しました)

  • ユーザーがデータベースから不明なエンティティを取得しようとしています (例: URL で不明なエンティティ ID を指定して WebUI から)

カスタム例外を定義できることは理解していますが、どこでどのように定義するのかよくわかりません。各レイヤーごとに定義する必要がありますか? ラッピング例外のプラクティスがあることは知っていますが、そのパターンを最適に使用する方法がよくわかりません。

また、いくつかのレイヤーでエラーごとに 1 つのカスタム例外を作成する必要があります (たとえば、同じメールで 2 人のユーザーを保存しようとする場合は UserAlreadyExistInDatabaseException、DB から不明なユーザーを取得しようとする場合は UnknownUserDatabaseException)、または複数のレイヤー エラーを処理する 1 つの例外タイプを作成する必要があります。 (例: DatabaseException、カスタム プロパティまたは Exception.Message プロパティでエラーを区別)。

4

1 に答える 1

7

EntLib の例外処理ブロックとログ ブロックは複雑すぎて一般的に構成および処理できないため、これらのブロックには近づきません。これらのタイプの問題にどのようにアプローチできるかを確認するためにそれらを調査することは確かにできますが、多くの場合、独自のソリューションを作成するか、ログに log4net や NLog などを使用する方が簡単です。

例外を処理する限り、プレゼンテーション レイヤー (WPF または ASP.NET) は、アプリケーション サービス レイヤーによって発生した例外をキャッチして解釈する必要があります。アプリケーション サービスは、ドメイン モデルとデータ アクセス レイヤー (DDD で言えばリポジトリ) を含むドメインをカプセル化します。アプリケーション サービスは、エラー情報を含む結果オブジェクトを返すか、ドメインまたは DAL から例外を伝達することができます。

特定の例外タイプで特定のことを行うためにそれらをキャッチする場合は、カスタム例外タイプを作成する必要があります。のような例外UserAlreadyExistInDatabaseExceptionは、アプリケーション サービスが例外をキャッチして何らかの結果オブジェクトを返してプレゼンテーション レイヤーで解釈できるため、役に立ちます。または、例外をプレゼンテーション レイヤーでキャッチして、ユーザーに通知することもできます。

ロギングは、アプリケーション サービス層、プレゼンテーション層、またはその両方で行うことができます。たとえば、アプリケーション サービスは、DAL から例外をキャッチしてログに記録し、プレゼンテーション層が解釈できる別の例外にラップできます。

ユーザーがデータベースから不明なエンティティを取得しようとしています

これはいくつかの方法で処理できます。1 つの方法は、アプリ サービスが null 参照を返し、プレゼンテーション レイヤーが適切なメッセージをユーザーに返すことです。別の方法として、DAL は EntityNotFoundException のようなものを発生させることができます。これはプレゼンテーション レイヤーでキャッチでき、ユーザーに適切なメッセージを返すこともできます。そのような例外を発生させることは、ASP.NET MVC のようなもので有益です。なぜなら、そのタイプの例外を受け取ったときに一般的な応答を返すアクション フィルターを作成できるからです。

于 2012-06-26T00:28:05.727 に答える