Sitecore Glass Mapper:接口或具体类的属性?

Iva*_*anL 5 sitecore glass-mapper

我们是Glass mapper的新手,想在我们的Sitecore项目中使用它.在查看教程时,我们注意到没有深入的示例说明如何设置Sitecore允许的深度继承.在浏览网页时,我们注意到有人在界面上放置属性,另一方面有人将属性放在具体的类上.这些例子都没有解释他们这样做的充分理由,但却给我们留下了一个问题:哪个是正确的用法,做一个或另一个有什么影响?

考虑以下:

模板:内容(添加2个简单字段的字段部分模板:标题,正文)此模板由我们的许多模板直接和间接继承.

现在在我们的一个子布局中,我们只使用这一部分,它是一种更通用的控制,因此我们需要做:GetCurrentItem<Content>GetCurrentItem<IContent>.

我个人觉得GetCurrentItem<IContent>更直观,因为它感觉问:"如果它支持内容部分给我当前项目",其他人感觉更像"如果它是内容部分,给我当前项目"(从技术上讲,这是不可能的永远不会创建内容项)

tec*_*414 9

为Glass Mapper配置接口可以达到一些目的.首先,Glass Mapper实际上可以根据您的界面创建动态代理对象.这意味着您实际上可以单独使用基于接口的Glass Mapper,而无需您自己的具体实现.

Mike Edwards在此描述了这一点.

在幕后,Glass.Sitecore.Mapper映射器检测到您正在使用接口并使用Castle Dynamic Proxies生成应用程序可以使用的具体类.

正如他所指出的,这增加了一些开销,并且确实无法添加额外的逻辑.

另一种用途是类型推断.这在接口的上下文中没有很好地记录,但无论是在调用SitecoreService还是在字段属性中,都要求Glass Mapper推断类型.对于此行为,您不需要映射接口字段.一定要包含具体类TemplateIdSitecoreClass属性.这应该允许您建模多重继承.

public interface ISitecoreItem {

    Guid ID{ get; }

    Language Language{ get; }

    int Version { get; }

    string Url { get; }
}

[SitecoreClass]
public partial interface IHeader : MyProject.Content.ISitecoreItem 
{

    Link LogoLink  {get; set;}

    Image Logo  {get; set;}

}



    [SitecoreClass(TemplateId="87d5b6c1-a084-4738-be11-b4e6fe07d894")]
    public partial class Header  : IHeader 
    {
        [SitecoreId]
        public virtual Guid ID{ get; private set;}

        [SitecoreInfo(SitecoreInfoType.Language)]
        public virtual Language Language{ get; private set; }

        [SitecoreInfo(SitecoreInfoType.Version)]
        public virtual int Version { get; private set; }

        [SitecoreInfo(SitecoreInfoType.Url)]
        public virtual string Url { get; private set; }

        [SitecoreField(FieldName = "Logo Link" )]
        public virtual Link LogoLink  {get; set;}

        [SitecoreField(FieldName = "Logo" )]
        public virtual Image Logo  {get; set;}


    }

var service = new SitecoreService(Sitecore.Context.Database);
var header = service.CreateClass<IHeader>(false /* don't lazy load */, true /* infer type */, headerItem);
Run Code Online (Sandbox Code Playgroud)