2

アプリケーションがあります(レガシーコード)

メソッドとのインターフェースが含まれていIcomponentますsave()

そしてそれを実装する多くのクラス。

save()ごとにログを追加したい。

updae

デザインのアイデアはほとんどありませんでした。

  • SingeltonLogger-ログに記録可能なすべてのアクションの後に呼び出されます

シンゲルトンの典型的なケースだと思いますLogServiceが、ユニットテストには難しいと思います。

  • Iocを使用したデコレータ+ロガーの初期化

Icomponent追加のlog()方法でデコレータパターンを使用します。

LogService各デコレータから呼び出されるクラスを作成しますlog()

  • AOP-アスペクト指向プログラミング

私はこれについて少し読みましたが、それを知りません。

それはc#に適用できますか?

  • そのソリューションに対するあなたのデザインは何でしょうか?

update2

コードを読んだ後、インターフェイスの別のレイヤーがあることがわかります

コンクリート層の前。私はすべての特定のインターフェースを飾るべきではないと思います。右?

I_AComponente : IComponente

I_BComponente : IComponente

A : I_AComponente

B : I_BComponente
4

2 に答える 2

1

シングルトンである必要はまったくありません。検討:

public void ComponentDecorator : IComponent
{
    private IComponent component;
    private ILogger logger;

    public ComponentDecorator(IComponent component, ILogger logger)
    {
        this.component = component;
        this.logger = logger;
    }

    public void Save()
    {
        this.component.Save();
        this.logger.Log("Some important message");
    }
}

とにかくデコレータに装飾されたコンポーネントを注入するので、ロガーを注入することもできます(これはテストがかなり簡単です)。ユニットテストの観点からは、どこloggerから来るのかは関係ありません。

また、独自のロガーをローリングする代わりに、 Apachelog4netなどの既存のロガーを確認する必要があります。

編集

staticシングルトンロガーをテストするのが難しいという主張は、C#のシングルトンが通常どこかのフィールドまたは静的クラスで実装されるという事実から来るかもしれません。あなたが持っていたと言う:

public static LoggerService
{
    public static Log(string message) { ... }
}

さて、あなたのデコレータのメソッドでは、おそらくそれらの線に沿って何かをしなければならないでしょう:

public void Save()
{
    this.component.Save();
    LoggerService.Log("Some important message");
}

Saveこれにより、メソッド内で依存関係が緊密に結合されているため、メソッドのテストがほぼ不可能になります。ファイルシステムに書き込まないようにテストを構成できれば、それほど悪くはありませLoggerServiceん(それでも、問題を解決するのではなく、回避することになります)。

インターフェースを介した注入では、その問題は自然に解消されます。LoggerServiceまだ静的クラスである可能性がありますが、それは単に非静的ロガーを提供する(そしてそれらの存続期間/スコープを管理する)ことができます。これにより、単体テストがまったく難しくなることはありません。

于 2012-05-09T19:22:35.270 に答える
0

はい!AOPはCシャープ http://www.developerfusion.com/article/5307/aspect-Oriented-programming-using-net/に適用できます

AOPは、コード全体にLogステートメントを記述しないようにするための良い方法です。これは、アプリにAOPを実装する方法の例です。ただし、次のリンクで提供されるアプローチの唯一の欠点は、CastleWindsorを構成する必要があることです http://ayende.com/blog/3474/logging -the-aop-way

于 2012-05-10T11:23:07.827 に答える