2013-04-03 11 views
5

Glass Mapperを初めて使用し、Sitecoreプロジェクトで使用したかったのです。私たちが気づいたチュートリアルを見ると、Sitecoreが許す深い継承をどのように設定するかの深い例はありませんでした。ウェブを閲覧するときに、インタフェースに属性を配置する作業者がいることがわかりました。また、他の側には、属性を具体的なクラスに配置している人がいます。これらの例はいずれも正しい理由を説明していませんが、質問を残してください:これは正しい使い方であり、どちらかを実行することの影響は何ですか? このテンプレートは、直接および間接的に私たちのテンプレートの多くによって継承されSitecore Glass Mapper:インターフェイスまたはコンクリートクラスの属性?

テンプレート:::(タイトル、本文2つのシンプルなフィールドを追加するフィールド・セクションのテンプレートです)コンテンツ

には、以下のことを検討してください。

ここでは、このセクションのみを使用しています。より一般的なコントロールの一種であるため、GetCurrentItem<Content>またはのようにする必要があります。

個人的には、「コンテンツセクションの場合は私に現在のアイテムを渡してください」と聞いているように、より直感的に感じます。

答えて

9

Glass Mapperのインターフェイスを設定すると、2つの目的を果たすことができます。最初に、Glass Mapperは実際にあなたのインターフェースに基づいて動的なプロキシオブジェクトを作成できます。つまり、独自の具体的な実装をせずに、インターフェイスだけでGlass Mapperを実際に使用することができます。

Mike Edwards describes this here。舞台裏

Glass.Sitecore.Mapperマッパーは、インタフェースを使用して、あなたが ていることを検出し、アプリケーションで使用することができます 具体的なクラスを生成するために城動的プロキシを使用しています。

彼が指摘しているように、これはいくらかのオーバーヘッドを追加し、追加ロジックを追加することができなくなります。

The other use is type inference。これはインターフェイスのコンテキストではうまく説明されていませんが、SitecoreServiceを呼び出すかフィールドの属性でGlass Mappingに型を推測するよう依頼してください。この動作のために、インターフェイスフィールドをマップする必要はありません。コンクリートクラスの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>()のようなものが有効です。返されるのはプロキシクラスであり、それが自分自身の課題(あなたがやっていることに応じて)を提供できることに注意するだけです。

関連する問題