3

基本的なロギングを目的としたアセンブリがあります。

このアセンブリを参照する他のアセンブリがあります。

参照アセンブリ間でオブジェクトインスタンスを共有する方法はありますか?つまり、1つのロギングアクティビティに対して、ロギングクラスの1つのインスタンスのみが使用されるということですか?

たとえば、ロガーアセンブリ/名前空間内のメソッドが呼び出された場合AddInfo()。アセンブリAに、使用する情報をログに記録する必要があるクラスがあるloggerInstance1.AddInfo()場合...およびアセンブリBが同じことを行う必要がある場合...同じものを再利用しloggerInstance1.AddInfo()ます...loggerInstance2.AddInfo()

4

5 に答える 5

6

…そして今、まったく違う何かのために。

別のまったく異なる戦略は、system.web を参照することです (はい、デスクトップ アプリでもこのアセンブリを参照できます)。

using System.Web;

次に、「グローバルに共有」したいクラスをキャッシュに入れます。

HttpRuntime.Cache.Insert("Logger", LoggingObject, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);

最後に、グローバル オブジェクトのインスタンスを取得するには、キャッシュから取得します。

object LoggingObject = HttpRuntime.Cache.Get("Logger");

バム。瞬時にグローバルにアクセスできるシングルユース オブジェクトで、Singleton パターンは不要です。

もちろん、ロジックを少し変更してロガーを取得することもできます。ロガーがまだ存在しない場合は、初めて作成し、後で使用できるようにキャッシュに入れます。アクセスの順序を知っているかどうかに依存します。

于 2010-12-24T06:41:24.797 に答える
3

ロギング クラスを 1 つのアセンブリでのみシングルトンにします。シングルトンが正しく記述されていて、パブリック.GetInstance()メソッドを使用してそのインスタンスを作成する限り、インスタンスは 1 つだけ作成されます。

このようなもの:

class Singleton
{
    private static Singleton instance;
    private static int usageCount;

    private Singleton()
    {
        usageCount= 0;
    }
    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            instance = new Singleton();
        }
        usageCount++;
        return instance;
    }
    public static int UsageCount
    {
        get { return usageCount; }
    }
}

私はちょうど興味があります: 別のアセンブリがログ クラスの独自のインスタンスを作成するのはなぜそんなに大したことですか? 特にそのような動作を防ぐ具体的な理由がない場合 (そして、ロギング クラスでその正当な理由が思いつかない場合)、それは実際にはより良い OO であり、おそらくより保守しやすいでしょう。

于 2010-12-24T05:23:46.693 に答える
2

プロジェクトで許可されている場合は、任意の IoC コンテナを使用できます。また、クラスを IoC にシングルトン スコープとして登録し、コンテナを使用してアセンブリ全体で単一のインスタンスを取得できます。

ただし、このソリューションでは、.net で Unity のような DI を使用する必要があります。

于 2010-12-24T06:27:43.133 に答える
0

私はフリップに半分同意します。

この特定のケースで必要なのは、Singleton パターンを実装することです。

http://www.dofactory.com/Patterns/PatternSingleton.aspx#_self1

これは完全に有効な OO 設計パターンですが、おそらくこの問題に対する最もテスト可能なソリューションではありません。静的であるため、ロガーに依存するクラスを単体テストする場合、抽象化がより困難になる可能性があります。

別の解決策は、コントロール コンテナーの反転を使用することです (Java の場合は Spring、MS.NET の場合は Spring.NET など)。このアプローチでは、ロガーに依存するオブジェクトは、ロガーである型のプロパティを公開するだけです。IoC コンテナーは、型とその作成方法を認識し、依存関係を配線します。ロガーを IoC コンテナーに登録する一環として、ロガーをシングルトンとして扱うようにコンテナーに指示できます。これにより、同じインスタンスが永続的に破棄されます。

このソリューションは明らかにより複雑であり、シングルトン パターンのログ記録などの場合は、より適している可能性があります。

実際、ロギングのためにいくつかのサードパーティライブラリをグーグルで検索することを強くお勧めします。MS.NET を使用している場合は、log4net が優れていることがわかりました。

于 2010-12-24T05:42:41.243 に答える
0

これら 2 つのアセンブリは、同じアプリ ドメインまたは同じプロセスで実行されていますか? 両方のアセンブリでコンパイルを完全に制御できる場合は、FlipScript のアイデアを取り入れてシングルトン クラスを作成し、すべてのログ記録が同じオブジェクトを介して行われるようにします。

試すことができる別のオプションは、サード パーティのログ ライブラリを使用することです。この 1 つの呼び出しlog4netを使用しました。

使い方は非常に簡単で、ロギングは高度に構成可能です。

于 2010-12-24T06:57:41.057 に答える