Sitecore,GlassMapper,接口和动态代理

时间:2015-09-23 16:16:46

标签: c# razor sitecore castle-dynamicproxy glass-mapper

在Sitecore中,我有2个类,代表2个可能作为另一个节点的子节点生存的节点。 我的模型包含一个Children属性,它是一个IEnumerable< INode> (两个类都实现了INode)。在运行时,我得到每个孩子的基础类型来识别它们并做一些事情。 在我的测试中,一切都像魅力一样。但实际的实施却没有。

基本上在剃刀视图中(继承自GlassView,我循环遍历INode子集合并调用.GetType()来识别基础类。但是我得到IColumnProxy类型,而不是获得正确的类型,这是动态的代理玻璃映射器用于创建视图模型。

有没有办法获取实际类型而不是动态代理? 感谢

编辑:这是代码示例:

public interface INode {}

[SitecoreType(TemplateId = "AAAAAAAAA", AutoMap = true)]
public Class NodeType1 : INode
{
   public string PropertyA { get; set; }
}

[SitecoreType(TemplateId = "BBBBBBB", AutoMap = true)]
public Class NodeType2 : INode
{
   public string PropertyB { get; set; }
}

[SitecoreType(TemplateId = "CCCCCCC", AutoMap = true)]
public class SitecoreItem 
{
   [SitecoreChildren(InferType=true)]
   public virtual IEnumerable<INode> Nodes { get; set; }
}

在剃刀视图中:

@foreach(var node in item.Nodes)
{
  var type = node.GetType(); //INodeProxy
  var isNode1 = node is NodeType1; //False
  var isNode2 = node is NodeType2; //False
  var baseType = node.GetType().BaseType; //DynamicProxy
}

项目中的引用是Glass.Mapper和Glass.Mapper.Sc

编辑:更新1

好吧,经过深入研究后,看起来GlassMapper就像我应该的那样做,但由于某些原因它在我的具体情况下不起作用。 我错过了什么?引用?

1 个答案:

答案 0 :(得分:0)

嗯,经过几天的深入研究,我可以肯定答案是:不是这种情况。基本上,它应该工作。但在我的情况下,没有办法获得接口的实际实现。 GlassMapper将实际的类替换为&#34; children&#34;中声明的接口的动态代理实现。属性,所以没有办法将每个孩子都投射到他们的实际类型。

这非常糟糕,因为可以防止实施一大堆动态方案。我已经创建了一个自定义映射器来处理这个问题。但正如我之前所写的那样,它只在这个具体案例中起作用。通常它应该工作。