Шаблон метаданных для графа вашего объекта - PullRequest
3 голосов
/ 04 апреля 2011

Я хочу добавить метаданные в мой граф объектов для данных не доменного типа, которые будут связаны с моими объектами, но не являются существенными для проблемного набора этого домена.Например, мне нужно сохранить параметры сортировки для моих объектов, чтобы пользователь мог настроить их порядок в пользовательском интерфейсе.Индексы сортировки должны быть сериализуемыми, чтобы объекты запоминали свои позиции.Это только один из нескольких других элементов метаданных, которые мне нужно сохранить для моих объектов.Моя первая мысль - решить эту проблему с помощью 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, чтобы получить все качества, которые он предоставляет, но это должно передать общую идею.

1 Ответ

1 голос
/ 04 апреля 2011

Метаданные буквально означают данные о данных , но то, что вы, похоже, запрашиваете, - это способ контроля и изменения поведения ваших объектов.

Я думаюТакая проблема гораздо лучше решается с помощью Ролевого интерфейса - см., например, выступление Уди Даана о Внедрение ролей .В частности, шаблон проектирования Strategy используется для определения слабосвязанного поведения.Я бы искал способ объединить эти два понятия.

Как мы уже знаем из .NET, использование статических, слабо типизированных атрибутов сильно ограничивает наши варианты перекомпоновки компонентов, поэтому я не буду вдаваться в подробности.это направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...