Хороший шаблон для создания каталога элементов с динамическими свойствами и файлом проекта

#c#

#c#

Вопрос:

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

Коротко о приложении :

  1. Приложение имеет локальный (оставшийся в далеком будущем) «каталог» устройств. Содержит определения устройств, начальные значения свойств, фотографии, графические данные и так далее;
  2. Каждое устройство имеет свой тип, категорию и свойства, некоторые (не все) свойства имеют приемлемый диапазон значений (диапазоны значений, отфильтрованное перечисление или даже список подпунктов (например, аксессуары, а свойства аксессуаров также могут основываться на свойствах устройства :))
  3. Пользователь может изменять некоторые свойства, эти свойства должны иметь проверку поля (проверка может основываться на значениях других свойств)
  4. Доступность свойства или / и диапазон его значений могут основываться на значении другого свойства этого устройства (в будущем может основываться даже на свойствах другого устройства). Например, если A = «1», то B может быть только 2 или 5. Или, если A = «2» и B = enum.value3, то C вообще недоступен пользователю и так далее.
  5. Пользователь может сохранять / загружать все выбранные устройства в «проект», но без изображений, графических данных и других статических свойств устройства.
  6. Отображаемые имена свойств, их значения (например, если их значение основано на перечислении) и типы значений (например, см, метры, Цельсий …) могут быть локализованы.

На данный момент я создал базовый класс проекта (сериализуемый) с IEnumerable<ProjectItemBase> в качестве хоста для всех добавленных пользовательских устройств и ProjectItemProperty<T> для хранения свойств устройства.

Но я застрял с :

  • Хороший способ работы с данными «каталога» и как связать его с фактическим классом устройства и его параметрами? База данных содержит огромное количество данных (например, изображений и графиков), которые нам не нужны большую часть времени (а также нам не нужно хранить их в файле проекта, поскольку они статичны для устройств), но при предварительном просмотре / печати устройства эти данные должны отображаться. Но данные, локализованные в свойствах, и другие вещи, которые нам нужны все время.
  • Сделать свойства устройства наиболее гибкими (но и не слишком сложными), с проверкой и зависимостью от других свойств с фильтром значений?

Комментарии:

1. Вы не должны использовать файл в качестве базы данных, когда у вас очень большой объем данных. Чтение и синтаксический анализ файла не так эффективны, как использование базы данных, которая предназначена для обработки больших объемов данных. Также использование файла приведет к проблемам с доступом, если несколько пользователей используют один и тот же файл. Я бы рекомендовал использовать SQL Server (или Express). Вы можете бесплатно скачать Express с MSDN и решить все ваши проблемы.

2. Я использую SQLite, поэтому это один файл, и он подходит для однопользовательского доступа, поскольку одновременно может быть запущен только один экземпляр приложения 🙂 Я не могу использовать фактическую службу базы данных, поскольку приложение должно быть независимым от какой-либо внешней службы. Также проще обновить один файл, чем db 🙂

3. SQL Server — это реальный сервер базы данных, который предназначен для многопользовательской среды и имеет механизм блокировки для предотвращения конфликтов при доступе к одним и тем же данным более одного пользователя. SQL Server также является многопоточным, что позволяет использовать несколько ядер в микропроцессоре. SQLite не является сервером, а является файловой базой и должен открывать и читать файл каждый раз, когда он используется. SQLite также не предназначен для многопользовательской работы. SQL Server в большинстве случаев будет работать быстрее, чем SQLite.

4. Я знаю 🙂 Но переход на полный sql не поможет в моем вопросе 🙂

5. Почему бы и нет? Используете ли вы Entity? С помощью SQLite вам приходится читать весь файл каждый раз, когда вы открываете соединение, что требует времени, даже если вам не НУЖНЫ данные. SQL Server после запуска считывает только данные, которые являются частью запроса. Один из ваших вопросов касается «данных, которые вам не нужны», и я продолжаю говорить, что SQL Serer будет работать быстрее, особенно когда вам не нужны все данные. Ваш реальный вопрос заключается в том, как увеличить скорость и уменьшить объем памяти, используемой базой данных. SQLite вы должны прочитать весь файл в память, пока SQL Server имеет ссылки на файл, поэтому вся база данных не находится в памяти.

Ответ №1:

Я создал базовый класс для хранения данных о свойствах

 [Serializable]
public class Property<T>: INotifyPropertyChanged
{
    protected T _Value;

    public T Value
    {
        get
        {
            return Value;
        }
        set
        {
            _Value = value;
            NotifyPropertyChanged();
        }
    }

    #region Implementation of INotifyPropertyChanged interface
    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}
  

Итак, на данный момент я могу наследовать его как

 [Serializable]
public class SomeProperty : Property<int>
{...}
  

Унаследованный класс свойств может содержать идентификатор ссылочного элемента в базе данных и может содержать дополнительные поля, такие как локализованное имя свойства, доступность и проверка. Также, используя интерфейс INotifyPropertyChanged, я смогу информировать другие свойства и / или хост элементов об изменениях значений.

Может быть, есть лучший способ?

Комментарии:

1. Не INotifyPropertyChanged реализовано для классов, которые содержат свойства, а не сами свойства?