Я работаю над унаследованным проектом, который интенсивно использует Singletons.Хотя большинство из них было бы лучше реализовано в противном случае, на данный момент цель состоит в том, чтобы проверить их.Таким образом, у меня есть следующая структура:
public class SomeSingleton
{
private Dependency someDependency;
public static readonly SomeSingleton Instance = new SomeSingleton();
static SomeSingleton() {}
private SomeSingleton()
{
someDependency = new Dependency();
}
}
Итак, чтобы сделать ее тестируемой без потери «Singelton'ness», я попытался добавить защищенный конструктор, который принимает зависимость в качестве параметра длявызов из наследующего класса, через который я могу выполнить тесты.Я понимаю, что открытие его для наследования также нарушает шаблон Singleton, но он используется только тестовой средой и не выполняется, как обычно, в рабочем коде.
Примерно так:
public class SomeSingleton
{
private Dependency someDependency;
public static readonly SomeSingleton Instance = new SomeSingleton();
static SomeSingleton() {}
private SomeSingleton() : this(new Dependency()) {}
protected SomeSingleton(Dependency someDependency)
{
this.someDependency = someDependency;
}
}
public class SomeSingletonTestImplementation : SomeSingleton
{
public SomeSingletonTestImplementation (Dependency someDependency)
: base (someDependency) {}
}
Наконец, после установки, вопрос:
В этой реализации я ожидал, что только защищенный конструктор в оригинальном Singleton будет вызван из наследника.Однако, когда я отлаживаю, вызывается конструктор в наследнике, но затем, вместо того, чтобы войти в защищенный конструктор, вызывается закрытый конструктор, а затем защищенный конструктор.
Есть ли способ, которым приватныйконструктор не будет называться?Кроме того, если у кого-то есть краткое объяснение того, почему так происходит, это было бы здорово.
Спасибо!