Sitecore Glass映射器:接口或具体类上的属性?

Sitecore Glass映射器:接口或具体类上的属性?,sitecore,glass-mapper,Sitecore,Glass Mapper,我们刚接触Glass mapper,希望在我们的Sitecore项目中使用它。在阅读教程时,我们注意到没有关于如何设置Sitecore允许的深度继承的详细示例。浏览网页时,我们注意到有人在界面上放置属性,而在另一边,有人在具体类上放置属性。这些例子都不能解释这样做的原因,但给我们留下了一个问题:哪一个是正确的用法,以及这样做或那样做的影响是什么? 考虑以下几点: 模板:内容(这是一个字段部分模板,添加了两个简单字段:标题、正文) 此模板由我们的许多模板直接或间接继承 现在,在我们的一个子布局中,

我们刚接触Glass mapper,希望在我们的Sitecore项目中使用它。在阅读教程时,我们注意到没有关于如何设置Sitecore允许的深度继承的详细示例。浏览网页时,我们注意到有人在界面上放置属性,而在另一边,有人在具体类上放置属性。这些例子都不能解释这样做的原因,但给我们留下了一个问题:哪一个是正确的用法,以及这样做或那样做的影响是什么?

考虑以下几点:

模板:内容(这是一个字段部分模板,添加了两个简单字段:标题、正文) 此模板由我们的许多模板直接或间接继承

现在,在我们的一个子布局中,我们只使用这个部分,它是一种更通用的控件,因此我们需要执行:
GetCurrentItem
GetCurrentItem


就我个人而言,我觉得
GetCurrentItem
更直观,因为它像是在问:“如果它支持内容部分,请给我当前项目”,而另一个更像是“如果它是内容部分,请给我当前项目”(这在技术上是不可能的,因为内容项目从未创建过)

我发现使用接口建模Sitecore模板通常是更好的选择。这使我能够在代码中对模板结构建模,就像它存在于Sitecore中一样。比如说,

public interface IMyPageTemplate : IBaseTemplate1, IBaseTemplate2 {

}
用具体的类对模板建模要困难得多,因为我们通常有许多基础模板。也许值得考虑(尽管我没有尝试过)某种接口和具体类的组合。也许,像
IContent
这样严格属于基础模板的模板应该建模为接口,可以创建为内容的所有模板都应该建模为具体类


执行类似于
GetCurrentItem()
的操作是有效的。值得注意的是,返回的是一个代理类,它可以提供自己的挑战(取决于您正在做什么)。

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

幕后Glass.Sitecore.Mapper Mapper检测到您 使用接口并使用Castle动态代理生成 应用程序可以使用的具体类

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

。这在接口上下文中没有很好的记录,但是在调用
SitecoreService
或在字段属性中,请Glass Mapper推断类型。对于这种行为,不需要映射接口字段。确保在具体类的
SitecoreClass
属性中包含
TemplateId
。这应该允许您对多重继承进行建模

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);
公共接口ISitecoreItem{
Guid ID{get;}
语言语言{get;}
int版本{get;}
字符串Url{get;}
}
[SitecoreClass]
公共部分接口IHeader:MyProject.Content.ISitecoreItem
{
链接logo链接{get;set;}
图像徽标{get;set;}
}
[SitecoreClass(TemplateId=“87d5b6c1-a084-4738-be11-b4e6fe07d894”)]
公共部分类标题:IHeader
{
[SitecoreId]
公共虚拟Guid ID{get;private set;}
[SitecoreInfo(SitecoreInfoType.Language)]
公共虚拟语言{get;private set;}
[SitecoreInfo(SitecoreInfoType.Version)]
公共虚拟整数版本{get;private set;}
[SitecoreInfo(SitecoreInfoType.Url)]
公共虚拟字符串Url{get;private set;}
[SitecoreField(FieldName=“徽标链接”)]
公共虚拟链接LogoLink{get;set;}
[SitecoreField(FieldName=“Logo”)]
公共虚拟图像徽标{get;set;}
}
var service=newsitecoreservice(Sitecore.Context.Database);
var header=service.CreateClass(false/*不延迟加载*/,true/*推断类型*/,headerItem);

谢谢,这就是我想要的解释。我希望将来能更好地记录推断类型功能。您可以使用扩展方法向接口添加额外的逻辑。当然不太理想。第一个链接断了,你知道有没有新的链接吗?谢谢@techphoria414。