В настоящее время у меня есть следующий класс:
public class PluginManager
{
private static bool s_initialized;
private static object s_lock = new object();
public static void Initialize() {
if (!s_initialized) {
lock (s_lock) {
if (!s_initialized) {
// initialize
s_initialized = true;
}
}
}
}
}
Здесь важно то, что Initialize () должен выполняться только один раз во время работы приложения. Я думал, что я реорганизовал бы это в одноэлементный класс, так как это было бы более потокобезопасным?:
public sealed class PluginService
{
static PluginService() { }
private static PluginService _instance = new PluginService();
public static PluginService Instance { get { return _instance; } }
private bool s_initialized;
public void Initialize() {
if (!s_initialized)
{
// initialize
s_initialized = true;
}
}
}
Вопрос первый, все-таки необходимо ли здесь иметь блокировку (я ее снял), поскольку мы будем когда-либо работать только над одним экземпляром?
Наконец, я хочу использовать DI и структурную карту для инициализации моих сервисов, поэтому я реорганизовал их следующим образом:
public interface IPluginService {
void Initialize();
}
public class NewPluginService : IPluginService
{
private bool s_initialized;
public void Initialize() {
if (!s_initialized) {
// initialize
s_initialized = true;
}
}
}
И в моем реестре:
ForRequestedType<IPluginService>()
.TheDefaultIsConcreteType<NewPluginService>().AsSingletons();
Это работает как ожидалось (синглтон возвращает true в следующем коде):
var instance1 = ObjectFactory.GetInstance<IPluginService>();
var instance2 = ObjectFactory.GetInstance<IPluginService>();
bool singleton = (instance1 == instance2);
Итак, мой следующий вопрос, является ли решение для структурной карты таким же потокобезопасным, как класс singleton (второй пример). Единственным недостатком является то, что это все еще позволяет напрямую создавать экземпляр NewPluginService (если не используется структурная карта).
Большое спасибо,
Бен