This article似乎表明它可能,但似乎跳过了该集合本身的关键实现。它列出了粗糙的结构:
public interface ICoordinate : IElement
{
float Longitude { get; set; }
float Latitude { get; set; }
}
public interface IPlace : IElement
{
string Description { get; set; }
ICoordinate Coordinate { get; }
}
public interface IPlaces : IFacet
{
IElementDictionary<IPlace> Places { get; }
}
正是我需要的对象集合。那么我该如何实现呢?
[Serializable]
internal class Coordinate : Element, ICoordinate
{
private const string LONGITUDE = "Longitude";
private const string LATITUDE = "Latitude";
public float Longitude
{
get
{
return this.GetAttribute<float>( LONGITUDE );
}
set
{
this.SetAttribute( LONGITUDE, value );
}
}
public float Latitude
{
get
{
return this.GetAttribute<float>( LATITUDE );
}
set
{
this.SetAttribute( LATITUDE, value );
}
}
public Coordinate()
{
this.EnsureAttribute<float>(LONGITUDE);
this.EnsureAttribute<float>(LATITUDE);
}
}
那是坐标,Places
怎么样?如何添加新地点?这篇文章似乎缺少这个信息
答案 0 :(得分:4)
使用基础注册属性,集合和词典 构造函数中的类使用以下帮助器方法:
this.EnsureAttribute<TValue>( string name ); this.EnsureElement<TElement>( string name ); this.EnsureDictionary<TElement>( string name ); this.EnsureCollection<TElement>( string name );
所以集合"Ensured"与属性不同。因此Places
类的实现(来自示例)看起来像:
[Serializable]
public Places : Facet, IPlaces
{
private const string FIELD_PLACES = "Places";
public Places()
{
this.EnsureDictionary<IPlace>(FIELD_PLACES);
}
public IElementDictionary<IPlace> Places
{
get
{
return this.GetCollection<IPlace>(FIELD_PLACES);
}
}
}
请注意不同的Get(this.GetCollection<IPlace>(FIELD_PLACES);
)和Ensure调用(this.EnsureDictionary<IPlace>(FIELD_PLACES);
)。如果您不这样做,您的收藏将是null
。 IPlace.Coordinate
将以相同的方式设置。通过调用它们,它将为您实现正确的集合。
添加也不是很明确(或解释)。 IElementDictionary
不公开Add方法。它确实暴露了Create()
。使用反射工具快速查看此内容,您可以看到它创建了一个项目并将其添加到词典中:
public TElement Create(string key)
{
Assert.ArgumentNotNull(key, "key");
TElement tElement = ModelFactory.CreateElement<TElement>();
this.dictionary.Add(key, tElement);
return tElement;
}
所以添加到Places字典就像:
IPlaces places = _contact.GetFacet<IPlaces>("name form XML config");
IPlace newPlace = places.Places.Create();
newPlace.Description = "test";
ICoordinate newCoord = newPlace.Coordinate.Create();
newCoord.Longitude = 0;
无需保存等。持久性等在内部处理。
您需要注册所有3&#34;元素&#34;但只有最顶层的方面(IPlaces
)需要进入XML的<entities>
集合。所以整个配置看起来像:
<sitecore>
<model>
<elements>
<element interface="Namespace.IPlaces, Dllname" implementation="Namespace.Places, Dllname" />
<element interface="Namespace.IPlace , Dllname" implementation="Namespace.Place, Dllname" />
<element interface="Namespace.ICoordinate, Dllname" implementation="Namespace.Coordinate , Dllname" />
</elements>
<entities>
<contact>
<facets>
<facet name="name form XML config" contract="Namespace.IPlaces, Dllname" />
</facets>
</contact>
</entities>
</model>
</sitecore>
Subsequently I've seen this article介绍了自定义数据的其他详细信息