Я хочу добавить метаданные в мой граф объектов для данных не доменного типа, которые будут связаны с моими объектами, но не являются существенными для проблемного набора этого домена.Например, мне нужно сохранить параметры сортировки для моих объектов, чтобы пользователь мог настроить их порядок в пользовательском интерфейсе.Индексы сортировки должны быть сериализуемыми, чтобы объекты запоминали свои позиции.Это только один из нескольких других элементов метаданных, которые мне нужно сохранить для моих объектов.Моя первая мысль - решить эту проблему с помощью MetadataItem и MetadataItemCollection, где базовый класс Entity будет иметь свойство «Meta» типа MetadataItemCollection.Например:
public class MetadataItem
{
public string Name;
public object Data;
}
public class MetadataItemCollection
{
/* All normal collection operations here. */
// Implementation-specific interesting ones ...
public object Get(string name);
public MetadataItem GetItem(string name);
// Strongly-type getters ...
public bool GetAsBool(string name);
public string GetAsString(string name);
// ... or could be typed via generics ...
public T Get<T>(string name);
}
public class Entity
{
public MetadataItemCollection Meta { get; }
}
Я могу подумать о следующих проблемах:
- Сериализация - в базе данных есть одна таблица EntityID |Имя |Значение, где Значение - это строка, и все типы сериализуются в строку?
- Будущее Проверка - что, если необходимо изменить тип элемента метаданных (маловероятный) или имя?
- Refactorability - если ключи поступают из статического списка через enum или класс со свойствами статических строк, или если разрешены строки произвольной формы:
var i = entity.Meta["SortIndex"];
против
public enum Metadatas { SortIndex };
var i = entity.Meta[Metadatas.SortIndex];
против
public static class Metadatas
{
public static string SortIndex = "SortIndex";
}
var i = entity.Meta[Metadatas.SortIndex];
Мысли, идеи, ошибки ???
Спасибо за ваше время.
Решение:
Следуя указаниям @ Mark и просмотрев видео Udi, с которым связан Mark, я создал два новых интерфейса: IUiPresentation и IUiPresentationDataPersistor.Важно отметить, что ни один из объектов в моей объектной модели Entity не осведомлен об этих интерфейсах;интерфейсы находятся в отдельной сборке и никогда не упоминаются в моей объектной модели Entity.Волшебство тогда сделано через IoC в моделях представления.Это может быть что-то вроде следующего:
public class PhoneViewModel
{
IUiPresentationDataPersistor<Phone> _uiData
IUiPresentation<Phone> _presenter;
// Let IoC resolve the dependency via ctor injection.
public PhoneViewModel(Phone phone, IUiPresentationDataPersistor<Phone> uiData)
{
_uiData = uiData;
_presenter = uiData.Get(phone); // Does a simple lookup on the phone's ID.
}
public int SortIndex
{
get { return _presenter.SortIndex; }
set { _presenter.SortIndex = value; }
}
public void Save()
{
_uiData.Save();
}
}
Это немного сложнее в том, что ViewModel реализует INotifyPropertyChanged, чтобы получить все качества, которые он предоставляет, но это должно передать общую идею.