2015-02-05 2 views
0

У меня есть класс для создания контекста объекта. Чтобы управлять созданием объекта, я хочу использовать одноэлементный шаблон. Как создать следующий шаблон создания объекта класса как singleton в C#?Как создать одноэлементный шаблон следующего класса

public abstract class EFContextBase<TContext> : IDisposable where TContext : ObjectContext, new() 
     { 
      private TContext _dataContext; 
       protected virtual TContext DataContext 
      { 
       get 
       { 
        if ((object)this._dataContext == null) 
         this._dataContext = Activator.CreateInstance<TContext>(); 
        return this._dataContext; 
       } 
      } 

    public EFContextBase() 
      { 
       this.DataContext.ContextOptions.LazyLoadingEnabled = true; 
      } 
       public void Dispose() 
      { 
       this.Dispose(true); 
       GC.SuppressFinalize((object)this); 
      } 
       private void Dispose(bool disposing) 
      { 
       if (!disposing || (object)this._dataContext == null) 
        return; 
       this._dataContext.Dispose(); 
       this._dataContext = default(TContext); 
      } 
     } 
+2

Почему бы это быть иначе, чем любой другой одноточечного вы создать? –

+0

Нет ответа, просто замечание: вы дали TContext ограничение new(), но вы используете Activator для создания экземпляра. –

+0

EFContextBase должен иметь индикатор локального флага для удаленной практики, чтобы избежать множественного размещения. –

ответ

1

Зачем нужен абстрактный класс Singleton? Абстрактные классы были сделаны, чтобы наследоваться другими классами. Синглтон - это шаблон проектирования, позволяющий избежать статических методов и сохранить возможность, чтобы сделать ваш класс экземпляром (возможно, для последующего использования). Вы должны подумать о своей архитектуре.

В общем, вы должны сделать класс синглтон следующим образом:

  1. Define приватного конструктором
  2. Define приватного переменным: private static readonly <<YourClass>> singleton = new <<YourClass>>()
  3. Определить общественное одноплодное свойство:
public <<YourClass>> Singleton 
{ 
    get { return singleton; } 
} 
0

несколько классических реализаций одноточечного на основе:

  1. статической инициализации конструктора (потокобезопасный по дизайну)
  2. Instance свойства геттерной двойной блокировки для потокобезопасности возвращения значения.
  3. .Net Lazy свойство на основе оболочки (может быть настроено на потокобезопасность, в конструкторе).