У меня есть веб-приложение .net, которое для всех целей и задач этого вопроса - CRUD со многими различными объектами домена.Как я могу подключиться ко всем сеттерам свойств производных классов из базового класса?
Общей темой через тезисы является необходимость знать, какие свойства свойства были изменены, а также свойства модели дочернего домена. В настоящее время для этого есть две разные системы.
Свойства свойства - это тот, который я пытаюсь разобраться с этим вопросом.
Щас все модели наследуют от основания PersistableModel, который имеет следующие поля и методы примечание:
private readonly List<string> _modifiedProperties = new List<string>();
public virtual ModelState State { get; set; }
public IEnumerable<string> ModifiedProperties { get { return _modifiedProperties; } }
protected bool HasModifiedProperties { get { return 0 < _modifiedProperties.Count; } }
public bool WasModified(string propertyName)
{
return _modifiedProperties.Contains(propertyName);
}
public void WasModified(string propertyName, bool modified)
{
if (modified)
{
if (!WasModified(propertyName)) _modifiedProperties.Add(propertyName);
}
else
{
_modifiedProperties.Remove(propertyName);
}
}
Затем в рамках каждой отдельной модели всякий раз, когда это свойство установлено, мы также должны вызвать WasModified со строкой имя свойства и логическое значение.
Очевидно, что это очень утомительно и подвержено ошибкам, что я хочу сделать, это перепроектировать этот базовый класс для автоматического добавления записей в словарь, когда установлено свойство производного класса.
В моих исследованиях, ближе всего я получил возможность использовать PostSharp, о котором не может быть и речи.
Это проблема 'INotifyPropertyChagned' (каждое свойство автоматически активирует событие PropertyChanged при изменении), нет хорошего решения. То, как WPF обошел это, было через Dependancy Properties. Свойства, которые вы создаете, являются только оболочками для 'GetValue (' и 'SetValue (' методы на 'DependencyObject' –
Я бы использовал защищенный индексатор в базовом классе, который использует частный словарь для сохранения значений. Таким образом, он может действовать как gatekeeper, где производные классы не реализуют свои собственные переменные-члены. – Biscuits