gpt4 book ai didi

Sitecore 玻璃映射器 : Attributes on interfaces or concrete classes?

转载 作者:行者123 更新时间:2023-12-04 17:23:29 25 4
gpt4 key购买 nike

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

考虑以下:

模板:内容(这是一个添加 2 个简单字段的字段部分模板:标题、正文)
这个模板直接和间接地被我们的许多模板继承。

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

我个人发现 GetCurrentItem<IContent>更直观,因为它感觉像是在问:“如果它支持内容部分,请给我当前项目”,而另一个感觉更像是“如果它是内容部分,请给我当前项目”(这在技术上是不可能的,因为内容项目永远不会创建)

最佳答案

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

Mike Edwards describes this here .

Behind the scenes Glass.Sitecore.Mapper mapper detects that you are using an interface and uses Castle Dynamic Proxies to generate a concrete class that your application can use.



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

The other use is type inference .这在接口(interface)的上下文中没有很好地记录,但在调用 SitecoreService或在您的字段属性中,让 Glass Mapper 推断类型。对于这种行为,您不需要映射接口(interface)字段。请务必包含 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);

关于Sitecore 玻璃映射器 : Attributes on interfaces or concrete classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com