【问题标题】:Sitecore, GlassMapper, Interfaces and Dynamic ProxiesSitecore、GlassMapper、接口和动态代理
【发布时间】:2015-10-14 18:12:34
【问题描述】:

在 Sitecore 中,我有 2 个类代表 2 个可能的节点,这些节点可以作为另一个节点的子节点存在。 我的模型包含一个 Children 属性,它是一个 IEnumerable (两个类都实现了 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 似乎按照我应该的方式进行操作,但由于某种原因,它在我的特定情况下不起作用。 我错过了什么?参考文献?

【问题讨论】:

  • 你尝试if (node is MyType)而不是调用GetType()glass.lu/Mapper/Sc/Tutorials/Tutorial17
  • 是的,我做到了,但它不起作用,因为接口实现被代理隐藏了
  • 是的。这就是 GlassMapper 所做的 - 它通过 Castle Windsor 生成自己的接口实现。
  • 我建议您检查每个对象是否实现了某个接口,而不是检查具体类型 - 前提是子项具有 2 个不同的 Sitecore 模板。

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


【解决方案1】:

好吧,经过几天对这个问题的研究,我可以肯定的答案是:不是这种情况。基本上,它应该工作。但就我而言,没有办法获得接口的实际实现。 GlassMapper 将实际类替换为在“children”属性中声明的接口的动态代理实现,因此无法将每个子类强制转换为它们的实际类型。

这太糟糕了,因为它阻止了一大堆动态场景的实现。我创建了一个自定义映射器来处理这个问题。但正如我之前写的,它仅在这种特定情况下不起作用。通常它应该可以工作。

【讨论】:

  • 我还没有在 V4 中尝试过这个,但它在 V3 中确实有效,因为我个人使用它的方式与我在之前的评论中提到的完全相同。您是在为您的玻璃模型使用接口还是具体类?
  • 同意 jammykam。我一直在实现 parent.Children.OfType() 。您可以检查 child.GetType().BaseType 但这不是必需的。
  • 你有这样的例子吗?谢谢
  • @jammykam 我正在使用具体类
  • 这是我调试的截图。我绝对不适合我screencast.com/t/vho7AnUO64
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多