_FileName = fileName;
  _Users = new List<SimpleUser>();
  _Serializer = new XmlSerializer(typeof(List<SimpleUser>));
  LoadStore(_FileName);
}

public static UserStore GetStore(string fileName)
{
  // Создать зарегистрированное хранилище, если оно еще не существует
  if (_RegisteredStores = null)
    _RegisteredStores = new Dictionary<string, UserStore>();
  
  // Вернуть соответствующее хранилище по переданному имени файла
  if (!_RegisteredStores.ContainsKey(fileName))
  {
    _RegisteredStores.Add(fileName, new UserStore(fileName));
  }

  return _RegisteredStores[fileName];
)

Класс включает несколько приватных членов — для имени файла хранилища, списка пользователей и экземпляра XmlSerializer, используемого для чтения и записи файлов.

Поскольку конструктор приватный, экземпляры не могут быть созданы вне класса. Внешние классы могут получать экземпляры только через вызов общедоступного статического метода GetStore(). Реализация шаблона Singleton в данном случае особенна. Она создает одиночные экземпляры на базе имен файлов. Для каждого файла, обрабатываемого поставщиком, создается по одному экземпляру класса UserStore. Если в одном и том же процессе более одного Web-приложения использует этого поставщика, необходимо обеспечить, чтобы разные экземпляры создавались для разных имен файлов. Таким образом, класс не управляет одной статической переменной для единственного экземпляра; вместо этого он включает словарь, содержащий все экземпляры класса, по одному для каждого имени файла.

Поскольку вы используете XML-сериализацию для сохранения и загрузки данных в хранилище, функции загрузки и сохранения достаточно просты:

private void LoadStore(string fileName)
{
  try
  {
    if (File.Exists(fileName))
    {
      using (XmlTextReader reader = new XmlTextReader(fileName))
      {
        _Users = (List<SimpleUser>)_Serializer.Deserialize(reader);
      }
    }
  }
  catch (Exception ex)
  {
    throw new Exception(
      string.Format("Unable to load file {0}", fileName), ex);
  }
}

предыдущая    следующая страница    вначало главы    оглавление

1030

Hosted by uCoz