我们正在开发一个多站点站点核心解决方案,其中每个站点都可以拥有自己的新闻,并且能够显示来自其他站点的组合新闻。
问题: 每个网站都有其独特的新闻要求,其中90%的模板字段匹配,但其余10%不同。
例如,Site-A具有带有作者下拉列表的新闻模板,其中作者列表在配置节点上创作。如果Site-B有新闻模板,其中作者是免费文本字段。
因此,当Glass Mapper自动尝试映射作者字段时,它会因自由文本而失败。
解决方案: 这可以通过在所有网站上创建作为下拉菜单但产品所有者不想要这个来解决。
另一种解决方案是从两个来源手动映射新闻字段或使用AUTOMAP等。
所需解决方案: Glassmapper会自动解析并填充“作者文本字段”或“下拉字段”。
以上可能吗?
谢谢。
答案 0 :(得分:1)
我会通过"流畅的配置",http://glass.lu/Mapper/Sc/Tutorials/Tutorial8.aspx来解决这个问题。 结合最近添加到Glass Mapper的新Delegate功能。 最初在此处介绍和描述了委托功能:http://cardinalcore.co.uk/2014/07/02/controlling-glass-fields-from-your-own-code/
代表功能的Nuget包:https://www.nuget.org/packages/Cardinal.Glass.Extensions.Mapping/
答案 1 :(得分:1)
您可以按如下方式使用推断类型:
public interface IBaseNews
{
string Author {get; set;}
//List all other shared fields below
}
[SitecoreType(TemplateId="....", AutoMap = true)]
public class NewsSiteA : IBaseNews
{
[SitecoreField]
public string Author {get; set;}
//List all fields which are unique for SiteA
}
[SitecoreType(TemplateId="....", AutoMap = true)]
public class NewsSiteB : IBaseNews
{
[SitecoreField]
public string Author {get; set;}
//List all fields which are unique for SiteB
}
现在,您的代码应为:
IBaseNews newsClass = NewsItem.GlassCast<IBaseNews>(true,true);
//You can use Author property now
答案 2 :(得分:1)
首先,我建议更新到最新版本的Glass,原因还包括代理功能。
从评论中的推断类型示例 - 您不应使用GlassCast,使用sitecore服务/上下文中的CreateType(项目项)。如果你采用带有Delegate的版本,那么现在在sitecore服务上有一个官方的Cast(Item项目)。
此外,使用a的示例无法解决类型的差异。代表会让这很容易。请记住,委托没有延迟加载,在这种情况下这应该无关紧要。
public interface INews
{
// All my other fields
string Author { get; set; }
}
流畅的配置就像(在GlassScCustom中完成)
SitecoreType<INews> = new SitecoreType<INews>();
sitecoreType.Delegate(y => y.Author).GetValue(GetAuthor);
fluentConfig.Add(sitecoreType);
private string GetAuthor(SitecoreDataMappingContext arg)
{
Item item = arg.Item;
if(item.TemplateID == <templateid>)
{
// return the value from the drop link
}
return item["Authors"];
}