我在 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个问题。
- 为什么使用推断的类型属性不能加载正确的类型而只加载基本类型?
- 为什么当我尝试通过添加自定义属性加载器来解决这个问题时,会出现异常?