IDbContextFactory-データベースのコンテキストを作成します。
OK、クラスがデータアクセスレイヤーとやり取りするビジネスレイヤーの内部にいる可能性があります。元気そうです。
IMapper-エンティティからドメインモデルへのマッピング。
全体像がなければ何も語ることは難しい。アーキテクチャが間違っている可能性があり、マッピングはデータアクセス層によって直接行われる必要があるか、またはアーキテクチャが完全に正常である可能性があります。すべての場合において、ここでこの依存関係を持つことは理にかなっています。
もう1つの選択肢は、クラスを2つに分割することです。1つはマッピングを処理し、もう1つは実際のビジネスロジックを処理します。これは、BLをDALからさらに分離するデファクトレイヤーを作成します。マッピングが複雑な場合、それは良い考えです。しかし、ほとんどの場合、それは役に立たない複雑さを追加するだけです。
IClock-DateTime.Nowを抽象化して、単体テストを支援します。
現在の時刻を取得するためだけに別のインターフェース(およびクラス)を用意することは、おそらくあまり役に立ちません。DateTime.Now
現在の時間を必要とするメソッドに単に渡します。
タイムゾーンや日付範囲などの他の情報がある場合は、別のクラスが意味をなす場合があります。
IPerformanceFactory-特定のメソッドの実行時間を測定します。
次のポイントを参照してください。
ILog-ロギング用のLog4net。
このような超越的な機能はフレームワークに属している必要があり、実際のライブラリは実行時に交換可能で構成可能である必要があります(たとえば、.NETのapp.configを介して)。
残念ながら、これは(まだ)事実ではありません。ライブラリを選択してそれに固執するか、必要に応じて後でライブラリを交換できるように抽象化レイヤーを作成できます。ライブラリの選択から独立することを特に意図している場合は、それを選択してください。ライブラリを何年も使用し続けると確信している場合は、抽象化を追加しないでください。
ライブラリが複雑すぎて使用できない場合は、ファサードパターンが理にかなっています。
ICollectionWrapperFactory-コレクションを作成します(IEnumerableを拡張します)。
これにより、ドメインロジックで使用される非常に具体的なデータ構造が作成されると思います。ユーティリティクラスのように見えます。代わりに、関連するコンストラクターを使用して、データ構造ごとに1つのクラスを使用します。初期化ロジックがコンストラクターに収まるように少し複雑である場合は、静的ファクトリーメソッドを使用します。ロジックがさらに複雑な場合は、ファクトリーまたはビルダーパターンを使用します。
IQueryFilterFactory-dbをクエリする入力に基づいてクエリを生成します。
なぜそれがデータアクセス層にないのですか?Filter
名前にaがあるのはなぜですか?
IIdentityHelper-ログインしたユーザーを取得します。
なぜHelper
サフィックスがあるのかわかりません。すべての場合において、他のサフィックスも特に明示的ではありません(IIdentityManager
?)
とにかく、ここにこの依存関係があることは完全に理にかなっています。
IFaultFactory-異なるFaultExceptionsを作成します(私はWCFを使用しています)。
ロジックが非常に複雑なので、ファクトリパターンを使用する必要がありますか?なぜDependency Injectionを使用するのですか?プロダクションコードとテストの間で例外の作成を交換しますか?どうして?
それを単純なものにリファクタリングしてみthrow new FaultException(...)
ます。すべての例外をグローバルな情報に追加してからクライアントに伝達する必要がある場合、WCFには、未処理の例外をキャッチして変更し、クライアントに再スローできるメカニズムがある可能性があります。
数値で品質を測定することは、通常、1か月に記述するコード行によって支払われるのと同じくらい悪いです。少数の依存関係を使用してくだらないクラスを作成できるため、適切に設計されたクラスには多数の依存関係が存在する可能性があります。