如何在Sitecore方面实现对象集合?

时间:2016-07-15 09:58:27

标签: c# content-management-system sitecore

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怎么样?如何添加新地点?这篇文章似乎缺少这个信息

1 个答案:

答案 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);)。如果您不这样做,您的收藏将是nullIPlace.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介绍了自定义数据的其他详细信息