Я много читал в экземпляре по сравнению с статическими классами и не нашел ответа на свой вопрос. Существуют ли какие-либо опасности для создания другого класса в статическом классе, на который ссылался класс экземпляра?экземпляр класса-> статический класс-> класс экземпляра в C#
Текущий проект, с которым я работаю, - это тот, в котором классы экземпляров называют статический метод «Логгер» (передача ряда параметров) для регистрации ошибок в текстовом файле в файловой системе. Я рефакторинг статического метода «Логгер» для создания экземпляра класса параметров (который представляет собой всего лишь ряд свойств и несколько вспомогательных методов для возврата себя как XML или строки) и класса DBLogger для регистрации ошибки в базе данных, а не файловой системы, передав класс параметра в качестве единственного параметра.
Эта модель хорошо работала в моем устаревшем коде VB6, в котором класс Logger был инстансом, а не статичным.
Но теперь в коде .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);
}
}
}
Вы говорите об одноэлементном шаблоне? Регистраторы часто реализуются как синглеты, поэтому я не думаю, что у вас действительно возникнут проблемы. Я думаю, что эта статическая концепция регистратора с дочерними экземплярами делает много смысла. –
Было бы очень полезно, если бы вы добавили свой код, чтобы лучше понять, о чем вы говорите. – konkked