我想在我的对象图中添加元数据,以获取与我的对象关联但对该域的问题集不重要的非域类型数据。例如,我需要为我的对象存储排序设置,以便用户可以配置它们在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; }
}
我能想到的一些问题是:
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以获得它提供的所有优点,但这应该传达一般的想法。
答案 0 :(得分:1)
元数据字面意思是有关数据的数据,但您似乎要求的是一种控制和更改对象行为的方法。
我认为使用Role Interface可以更好地解决这种问题 - 请参阅例如Udi Dahan谈论Making Roles Explicit。更具体地说,Strategy设计模式用于定义松散耦合的行为。我想找到一种方法来结合这两个概念。
正如我们从.NET中已经知道的那样,静态,弱类型属性的使用严重限制了我们重新组合组件的选项,因此我不会朝这个方向发展。