_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