2013-04-03 42 views
5

我們是Glass mapper的新手,並希望在我們的Sitecore項目中使用它。在查看我們注意到的教程時,沒有深入介紹如何設置Sitecore允許的深層繼承。在瀏覽網頁時,我們注意到有人在將接口屬性放在接口上,另一方面有人將屬性放在具體的類上。這些例子都沒有解釋他們這樣做的充分理由,但留給我們的是這樣一個問題:哪一個是正確的使用方法?做一個或另一個的影響是什麼?Sitecore Glass Mapper:接口或具體類的屬性?

考慮以下幾點:

模板:內容(這是一個場段模板添加2個簡單的字段:標題,正文) 此模板由我們的很多模板,直接和間接地繼承。

現在在我們的一個sublayouts中,我們只使用這一部分,它是一種更一般的控制,因此我們需要做:GetCurrentItem<Content>GetCurrentItem<IContent>

就我個人而言,我發現GetCurrentItem<IContent>更直觀,因爲它感覺像問:「給我目前的項目,如果它支持內容部分」,其他感覺更像「給我當前項目,如果它是內容部分」(這在技術上是不可能的,因爲內容項目從未被創建)

回答

9

配置Glass Mapper的接口可以用於兩個目的。首先,Glass Mapper實際上可以根據您的界面創建動態代理對象。這意味着您實際上可以單獨使用基於接口的Glass Mapper,而無需您自己的具體實現。

Mike Edwards describes this here

幕後Glass.Sitecore.Mapper映射器檢測到您正在使用的 界面和使用城堡動態代理生成您的應用程序可以使用 具體類。

正如他指出的那樣,這增​​加了一些開銷,並且確實無法添加額外的邏輯。

The other use is type inference。這在接口的上下文中沒有很好的記錄,但要麼在調用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); 
+0

謝謝,這是我正在尋找的解釋。我希望未來能夠更好地記錄推斷類型的功能。 – IvanL

+0

您可以使用擴展方法向接口添加其他邏輯。當然,這並不理想。 – Iucounu

+0

第一個鏈接被破壞,你知道是否有新的鏈接? –

1

我發現使用接口建模我的Sitecore模板,通常是更好的選擇。這允許我在代碼中模擬我的模板結構,就像它在Sitecore中存在的一樣。例如,

public interface IMyPageTemplate : IBaseTemplate1, IBaseTemplate2 { 

} 

這是更困難的,因爲我們通常有一些基本模板,以我們的模板與混凝土類建模。也許這是值得考慮的(儘管我沒有嘗試過)接口和具體類的某種組合。也許,嚴格基礎模板的模板(如IContent)應該建模爲接口,並且可以創建爲內容的所有模板都應該建模爲具體類。

這是有效做類似GetCurrentItem<IContent>()。值得注意的是返回的是一個代理類,它可以提供它自己的挑戰(取決於你在做什麼)。

相關問題