Iva*_*anL 5 sitecore glass-mapper
我们是Glass mapper的新手,想在我们的Sitecore项目中使用它.在查看教程时,我们注意到没有深入的示例说明如何设置Sitecore允许的深度继承.在浏览网页时,我们注意到有人在界面上放置属性,另一方面有人将属性放在具体的类上.这些例子都没有解释他们这样做的充分理由,但却给我们留下了一个问题:哪个是正确的用法,做一个或另一个有什么影响?
考虑以下:
模板:内容(添加2个简单字段的字段部分模板:标题,正文)此模板由我们的许多模板直接和间接继承.
现在在我们的一个子布局中,我们只使用这一部分,它是一种更通用的控制,因此我们需要做:GetCurrentItem<Content>
或GetCurrentItem<IContent>
.
我个人觉得GetCurrentItem<IContent>
更直观,因为它感觉问:"如果它支持内容部分给我当前项目",其他人感觉更像"如果它是内容部分,给我当前项目"(从技术上讲,这是不可能的永远不会创建内容项)
为Glass Mapper配置接口可以达到一些目的.首先,Glass Mapper实际上可以根据您的界面创建动态代理对象.这意味着您实际上可以单独使用基于接口的Glass Mapper,而无需您自己的具体实现.
在幕后,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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4473 次 |
最近记录: |