インスタンスクラスと静的クラスについて多くのことを読みましたが、私の質問に対する答えは見つかりませんでした。インスタンスクラスによって参照された静的クラスに別のクラスをインスタンス化することへの危険はありますか?
私が使用している現在の設計は、インスタンスクラスが静的な「ロガー」メソッド(一連のパラメーターを渡す)を呼び出して、ファイルシステム内のテキストファイルにエラーを記録する設計です。静的な「Logger」メソッドをリファクタリングして、パラメータークラス(一連のプロパティと、XMLまたは文字列としてそれ自体を返すいくつかのヘルパーメソッド)と、エラーをデータベースではなくデータベースに記録するDBLoggerクラスをインスタンス化します。ファイルシステム、唯一のパラメータとしてパラメータクラスを渡します。
このモデルは、静的ではなくLoggerクラスがインスタンス化されたレガシーVB6コードでうまく機能しました。
しかし、.NETコードでは、2つの新しいクラス(パラメーターとDBLogger)を静的にするか、DBLoggerを静的にしてパラメータークラスをインスタンス化するかがわかりません。静的クラスからインスタンスが作成されている(または作成されていない)場合の同時実行/マルチスレッドデータの問題の可能性について懸念しています。私は心配する権利がありますか、それとも何も心配していませんか?
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
// all code truncated for illustration purposes
namespace ThisIs.A.Test
{
//INSTANCE
public class ErrorLogParameters
{
private int mThreadId = 0;
private int mErrorNumber = 0;
private string mServerDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
public int ThreadId
{
get { return mThreadId; }
set { mThreadId = value; }
}
public int ErrorNumber
{
get { return mErrorNumber; }
set { mErrorNumber = value; }
}
public string ServerDate
{
get { return mServerDate; }
}
}
//INSTANCE
public class ErrorLog
{
public void LogErrorToDatabase(ErrorLogParameters criteria)
{
//Log error to database here
}
}
//STATIC - Instantiates INSTANCE of ErrorLogParameters and ErrorLog
public class Logger
{
public static void WriteLog(string pstrObjectName, string pstrProcedureName, int plngErrNumber, string pstrErrDescription)
{
// create a new parameter object
ErrorLogParameters objParameters = new ErrorLogParameters();
// populate object properties
objParameters.ErrorNumber = mlngErrNumber;
objParameters.ThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
ErrorLog objErrorLog = new ErrorLog();
objErrorLog.LogErrorToDatabase(objParameters);
}
}
//INSTANCE - Invokes STATIC method
public class SomeInstance
{
private void ErrorHandler_Log(Exception exception, string procedureName, string additonalDescription, string stackTrace)
{
// call from instance class to static class
Logger.WriteLog(mstrObjectName, procedureName, mlngErrNumber, mstrErrDescription);
}
}
}