为 Glass Mapper 配置接口可以用于几个目的。首先,Glass Mapper 实际上可以根据您的界面创建动态代理对象。这意味着您实际上可以仅基于接口使用 Glass Mapper,而无需您自己的具体实现。
Mike Edwards 在这里对此进行了描述。
在幕后 Glass.Sitecore.Mapper 映射器检测到您正在使用接口并使用 Castle Dynamic Proxies 生成您的应用程序可以使用的具体类。
正如他所指出的,这会增加一些开销,并且确实无法添加额外的逻辑。
另一个用途是类型推断。这在接口的上下文中没有很好地记录,但是在调用SitecoreService
或您的字段属性中,请 Glass Mapper 推断类型。对于这种行为,您不需要映射接口字段。一定要包括你的具体类TemplateId
的SitecoreClass
属性。这应该允许您对多重继承进行建模。
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);