2


0

今後の.Netプロジェクトのアイデアで循環参照の可能性がある状況を予測しています…​ 気をつけるべきことは何ですか?

そのため、このデータアクセスレイヤーがあり、データベースにログを記録する必要もあります。 自分のドッグフードを食べるという精神で、データアクセス層を使用してログを記録したいと思います。 ただし、データアクセス自体もログに記録します。 そのようです:

App
||
V
Log
||
V
Data=>Log

フィードバックループに入る危険はありますか? もしそうなら、どうすればそれを避けるべきですか? プロジェクトの参照が互いにループし、ビルドが困難になる可能性がありますか? 過去にどのようにこの(アンチ?)パターンに成功しましたか?

2 Answer


1


インターフェイスのみを含むアセンブリ(または場合によってはアセンブリ)を作成します。 具象クラスアセンブリからインターフェースのみのアセンブリを参照し、すべての具象クラスに1つ以上のインターフェースを実装させます。 ソリューションの一部である他の具象クラスアセンブリを参照する具象クラスアセンブリを持たないでください。

このアプローチは、循環依存を回避するのに役立ちます。

dependency injection /http://en.wikipedia.org/wiki/Inversion_of_control [コントロールコンテナの反転]を実装しますDefault.htm [StructureMap]または他の多くの.NETオプションのいずれかを使用して、カップリングをさらに削減できます。


1


おそらく過度に単純化されたソリューション:

public interface ILoggable {
    string ToLogFormat();
}

次に、ログに記録できるオブジェクトにこのインターフェイスを実装します。 ロギングレイヤーはインターフェイスのみに依存するようになり、どのレベルでも使用できます。

別の方法は、「ヘルパー」クラスを使用して、オーバーロードを介してToLogFormatを実装することです。

public class LogHelper {
    public string ToLogFormat(DAO obj) { ... }
    public string ToLogFormat(SomeOtherClass obj) { ... }
    ...
}

1つのモノリシックログヘルパーを使用できます(すべてのライブラリを参照する必要があるため、これは悪いことです)。より良い解決策は、アセンブリまたはクラスごとにログヘルパーを実装し、カスタム属性を使用してログヘルパークラスの名前を指定することです

個人的には、より柔軟なILoggableアプローチを好みます。ロギングパッケージには、次のような単純な関数を含めることができます。

public class Logger {
    public string ToLogFormat(object obj) {
        if (obj is ILoggable) {
            return ((ILoggable)obj).ToLogFormat();
        }
        return obj.ToString();
    }
}