コードが属するDDDでの検証などについて議論するのは私の意図ではなく、1つの可能なアプローチとローカリゼーションの問題に対処する方法に焦点を当てることです。シナリオを例示するドメインオブジェクト(エンティティ)の1つで、次の動作(メソッド)があります。
public void ClockIn()
{
if (WasTerminated)
{
throw new InvalidOperationException("Cannot clock-in a terminated employee.");
}
ClockedInAt = DateTime.Now;
:
}
ご覧のとおり、ClockInメソッドが呼び出されると、メソッドはオブジェクトの状態をチェックして、Employeeが終了していないことを確認します。従業員が終了した場合、「エンティティを無効な状態にしない」アプローチと一致する例外をスローします。
私の問題は、例外メッセージをローカライズする必要があることです。これは通常、(このアプリケーションでは)メソッドへのアクセスを必要とするクラスでMEFを使用してインポートされるアプリケーションサービス(ILocalizationService)を使用して行われます。ただし、他のDIフレームワークと同様に、依存関係は、オブジェクトがコンテナーによってインスタンス化された場合にのみ注入/インポートされます。これは通常、DDDには当てはまりません。
さらに、DDDについて私が学んだことはすべて、ドメインオブジェクトに依存関係を持たせてはならず、それらの懸念はドメインオブジェクトの外部で処理する必要があるということです。その場合、上記のようなメッセージをローカライズするにはどうすればよいですか?
非常に多くのビジネスアプリケーションがグローバリゼーション/ローカリゼーションを必要とするため、これは新しい要件ではありません。これを機能させ、それでもDDDの目標と一致させる方法についていくつかの推奨事項をいただければ幸いです。
アップデート
私は当初、ローカリゼーションがすべてデータベース駆動型であることを指摘できなかったため、ローカリゼーションサービスがあります(注入可能なILocalizationServiceインターフェイスを介して)。したがって、プロジェクトの一部としてVisual Studioが提供する静的リソースクラスを使用することは、実行可能なオプションではありません。
別の更新
おそらくそれは、アプリがRESTfulサービスアプリであると述べるために議論を進めるでしょう。したがって、クライアントは単純なWebブラウザである可能性があります。そのため、呼び出し元があらゆる種類のローカリゼーション、コードマッピングなどを実行できることを期待してコーディングすることはできません。例外が発生した場合(このアプローチでは、ドメインオブジェクトを無効な状態にしようとすることは例外です)、例外がスローされ、適切なHTTPステータスコードが例外メッセージとともに返されます。例外メッセージは、呼び出し元の文化(Accept-Language)にローカライズする必要があります。