对象图的元数据模式

时间:2011-04-04 06:17:31

标签: c# design-patterns metadata

我想在我的对象图中添加元数据,以获取与我的对象关联但对该域的问题集不重要的非域类型数据。例如,我需要为我的对象存储排序设置,以便用户可以配置它们在UI中的显示顺序。排序索引应该是可序列化的,以便对象记住它们的位置。这只是我需要为我的对象持久保存的其他一些元数据中的一个。我的第一个想法是通过使用MetadataItem和MetadataItemCollection来解决这个问题,其中基本实体类将具有MetadataItemCollection类型的“Meta”属性。 E.g:

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的表名称| Value是值的字符串,所有类型都被序列化为字符串?
  • 未来校对 - 如果需要更改元数据项的类型(不太可能)或名称,该怎么办?
  • 可重构性 - 如果密钥来自静态列表,通过枚举或具有静态字符串属性的类,或者应该允许自由格式字符串:
var i = entity.Meta["SortIndex"];

VS

public enum Metadatas { SortIndex };
var i = entity.Meta[Metadatas.SortIndex];

VS

public static class Metadatas
{
    public static string SortIndex = "SortIndex";
}
var i = entity.Meta[Metadatas.SortIndex];
  • 还有别的吗?

思想,想法,陷阱???

感谢您的时间。

解决方案:

跟随@Mark的领先,在观看了与之关联的Udi视频后,我创建了两个新接口: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 个答案:

答案 0 :(得分:1)

元数据字面意思是有关数据的数据,但您似乎要求的是一种控制和更改对象行为的方法。

我认为使用Role Interface可以更好地解决这种问题 - 请参阅例如Udi Dahan谈论Making Roles Explicit。更具体地说,Strategy设计模式用于定义松散耦合的行为。我想找到一种方法来结合这两个概念。

正如我们从.NET中已经知道的那样,静态,弱类型属性的使用严重限制了我们重新组合组件的选项,因此我不会朝这个方向发展。