Возникает повторяющаяся проблема проектирования с некоторыми классами, которые требуют одноразовой инициализации с помощью параметра, такого как имя внешнего ресурса, такого как файл конфигурации.
Например, у меня есть проект corelib, который обеспечивает ведение журнала, настройку и общие вспомогательные методы для всего приложения. Этот объект может использовать статический конструктор для инициализации, но ему нужен доступ к файлу конфигурации, который он не может найти сам.
Я вижу пару решений, но оба они кажутся не совсем правильными:
1) Использовать конструктор с параметром. Но тогда каждый объект, который требует функциональности corelib, должен также знать имя файла конфигурации, так что это должно быть передано приложению. Кроме того, если бы я реализовал corelib как синглтон, мне также пришлось бы передать файл конфигурации в качестве параметра методу GetInstance, что, я считаю, также неправильно.
2) Создайте статическое свойство или метод для передачи через файл конфигурации или другой внешний параметр.
Я как бы использовал последний метод и создал метод Load, который инициализирует внутренний класс, который он передает через файл конфигурации в конструкторе. Затем этот внутренний класс предоставляется через открытое свойство MyCoreLib.
public static class CoreLib
{
private static MyCoreLib myCoreLib;
public static void Load(string configFile)
{
myCoreLib = new MyCoreLib(configFile);
}
public static MyCoreLib MyCoreLib
{
get { return myCoreLib; }
}
public class MyCoreLib
{
private string configFile;
public MyCoreLib(string configFile)
{
this.configFile = configFile;
}
public void DoSomething()
{
}
}
}
Я все еще не счастлив, хотя. Внутренний класс не инициализируется до тех пор, пока вы не вызовете метод load, поэтому его необходимо учитывать везде, где осуществляется доступ к MyCoreLib. Также ничто не мешает кому-то снова вызывать метод загрузки.
Какие-нибудь другие шаблоны или идеи, как этого достичь?