Я создал класс, который представляет собой нечто среднее между синглтоном (пятая версия) и фабрика (вводимая зависимость). Назовите это «монофабрикой»? Это работает и выглядит так:
public static class Context
{
public static BaseLogger LogObject = null;
public static BaseLogger Log
{
get
{
return LogFactory.instance;
}
}
class LogFactory
{
static LogFactory() { }
internal static readonly BaseLogger instance = LogObject ?? new BaseLogger(null, null, null);
}
}
//USAGE EXAMPLE:
//Optional initialization, done once when the application launches...
Context.LogObject = new ConLogger();
//Example invocation used throughout the rest of code...
Context.Log.Write("hello", LogSeverity.Information);
Идея состоит в том, чтобы монофабрику можно было расширить для обработки более одного элемента (например, более одного регистратора). Но мне бы хотелось, чтобы монофабрика выглядела так:
public static class Context
{
private static BaseLogger LogObject = null;
public static BaseLogger Log
{
get
{
return LogFactory.instance;
}
set
{
LogObject = value;
}
}
class LogFactory
{
static LogFactory() { }
internal static readonly BaseLogger instance = LogObject ?? new BaseLogger(null, null, null);
}
}
Вышеупомянутое не работает, потому что в момент касания свойства Log (при вызове установщика) он вызывает выполнение пути кода, связанного с получателем ... что означает, что внутренние данные «экземпляра» LogFactory всегда устанавливаются в BaseLogger (устанавливать «LogObject» всегда слишком поздно!).
Итак, есть ли украшение или другой трюк, который я мог бы использовать, который заставил бы путь "get" свойства Log быть ленивым, пока вызывается установленный путь?