1

次の基本的なデータ テンプレート構造を持つ Sitecore インスタンスで Glass Mapper を使用しています。

  • ベース
    • BaseWithList
    • BaseWithExtraContent
      • BaseWithExtraContentAndCallToActionLink

この構造にも従うように、プロジェクトにモデル クラスを追加しました。クラス名はテンプレート名と一致します。

[SitecoreType(TemplateId = "{5D19BD92-799E-4DC1-9A4E-1DDE3AD68DAD}", AutoMap = true)]
public class Base
{
   public virtual string Title {get;set;}
   public virtual string Content {get;set;}
}

[SitecoreType(TemplateId = "{0491E3D6-EBAA-4E21-B255-80F0607B176D}", AutoMap = true)]
public class BaseWithExtraContent : Base
{
    public virtual string ExtraContent {get;set;}
}

[SitecoreType(TemplateId = "{95563412-7A08-46A3-98CB-ABC4796D57D4}", AutoMap = true)]
public class BaseWithExtraContentAndCallToActionLink : BaseWithExtraContent
{
    public virtual string CallToActionLink {get;set;}
}

これらのデータ モデルは、基本型のリストを持つ別のクラスから使用されます。ここに任意の派生型を格納できるようにしたいので、このチュートリアルで説明されているように属性を追加しました

[SitecoreType(AutoMap = true)]
public class HomePage
{
    [SitecoreChildren(InferType = true)]
    [SitecoreField(FieldName = "Widgets")]
    public virtual IEnumerable<Base> Widgets { get; set; }
}

チュートリアルによると、これはうまくいくはずです。ただし、ウィジェットのリストには基本型のクラスが含まれているだけです。

次に、Glass がインストールされているアセンブリとは異なるアセンブリにモデルを分離した場合は、モデルが含まれているアセンブリを指す AttributeConfigurationLoader を追加する必要があるという後のチュートリアルを見つけました。基本型と派生型はすべて含まれています。同じアセンブリなので、これで問題が解決するかどうかはわかりませんでしたが、とにかく試しました.

私のカスタムローダー構成は次のようになります。

public static  class GlassMapperScCustom
{
    public static void CastleConfig(IWindsorContainer container)
    {
        var config = new Config {UseWindsorContructor = true};

        container.Install(new SitecoreInstaller(config));
    }

    public static IConfigurationLoader[] GlassLoaders()
    {

        var attributes = new AttributeConfigurationLoader("Project.Data");

        return new IConfigurationLoader[] {attributes};
    }
    public static void PostLoad(){
        //Remove the comments to activate CodeFist
        /* CODE FIRST START
        var dbs = Sitecore.Configuration.Factory.GetDatabases();
        foreach (var db in dbs)
        {
            var provider = db.GetDataProviders().FirstOrDefault(x => x is GlassDataProvider) as GlassDataProvider;
            if (provider != null)
            {
                using (new SecurityDisabler())
                {
                    provider.Initialise(db);
                }
            }
        }
         * CODE FIRST END
         */
    }
}

カスタム ローダー構成を実行すると、「あいまいな一致が見つかりました」という例外が発生します。そのアセンブリのクラスに設定されている Glass 以外の属性が他にあるかどうかを確認しましたが、ありません。

何か案は?2問あると思います。

  1. 推論された型属性を使用すると、正しい型が読み込まれず、基本型のみが読み込まれるのはなぜですか?
  2. カスタム属性ローダーを追加してこれを解決しようとすると、例外が発生するのはなぜですか?
4

1 に答える 1

1

Widgets プロパティには 2 つの属性があります。アイテムの子要素にマップされるか、フィールドにマップされます。両方を指定することはできません。

于 2014-09-06T10:42:09.923 に答える