私は最近、Mark Seemannの本をDependency Injectionについて読んできましたが、Inversion of Controlについていくつかのアーキテクチャ上の問題が提起されています。 のは、以下の私が持っていると仮定しましょう:IoC Architecture
- CompositionRoot.exeと呼ばれる合成ルートとして動作する、非常に基本的な実行可能なプロジェクト。 Domain.dllというライブラリにコンパイル
- ドメインプロジェクト、
- DAL.dll
- Logging.dll というライブラリにコンパイルし、ロギングプロジェクト、というライブラリにコンパイルデータ・アクセス・プロジェクト、
Seemanの本のIoCパターンに従って、リポジトリインターフェイスはドメインに定義されます。 DALはDomainを参照し、これらのインターフェイスを実装します。 CompositionRootは、これらのリポジトリをインスタンス化し、それらをドメインに注入する役割を担います。これまでのところ、それほど平穏ではありません。
今質問です。どのようにロギングがこのシナリオに適合していますか?
私はDomainとDALの両方で使用されているロギングライブラリを構想しました。 StackOverflowの一部の読者は、一部の開発者はロギングがドメインにのみ属すると考えていることを示しています。特定のSQLをベンチマークする場合や、Entity Framework固有の例外をドメインに公開することなくEntity Framework例外を記録する場合など、DALのロギングが役に立ちます。
ここで、ドメインとDALの両方にログインしたいとしましょう(他に誰かが私を納得させることができない限り)。リポジトリインタフェースと同様のドメインでロギングインタフェースを定義する必要がありますか?もしそうなら、これはDALのロギングをドメインロギングに結びつけ、間違っていると感じます。あるいは、DALは独自のロギングインターフェイスを定義して、ロギングも実装することができます。しかし、これはロギングにつながり、ロギングを必要とする新しいDLLごとに新しいインターフェイスを実装する必要がありますが、これも間違っています。あるいは、DomainとDALがLoggingを参照すべきか(IoCに反するように思われる)?別の方法がありますか?私はまだSeemannの本を完成させていないが、インターフェースライブラリー、すなわちちょうどインターフェースで構成されたDLLを使用することを暗唱した数点で、私は現在、これがどのように機能するかを描写できません。
こんにちはスティーブン、よく考えています。私はあなたが書いたすべてのものにすでに精通しており、実際には、この記事を読む前に、サードパーティーのロガーの使用のために記述した方法とまったく同じテストアプリケーションをコーディングしました。しかし、私はまだ、ドメインとDALの間でロギングが共有されているため、驚きの気持ちを残していました。この不協和音の原因を最終的に理解するためにLSPに言及しました。 投稿が私の考えを明確にするのに役立ちましたので、私はそれを受け入れられた回答としてマークします。ありがとう。 – Tom