2015-09-23 2 views
1

В Sitecore у меня есть 2 класса, представляющие два возможных узла, которые могут жить как дочерние элементы другого узла. Моя модель содержит свойство Children, которое является IEnumerable <INode> (INode реализуется обоими классами). Во время выполнения я получаю базовый тип каждого ребенка, чтобы идентифицировать их и делать некоторые вещи. Все работает как шарм в моих тестах. Но фактическая реализация не делает.Sitecore, GlassMapper, интерфейсы и динамические прокси

В основном в виде бритвы (наследующий от GlassView, я просматриваю коллекцию дочерних элементов INode и вызываю .GetType() для определения базового класса. Но вместо получения правильного типа я получаю тип IColumnProxy, который является динамический прокси стекла картограф использует для создания модели представления

есть ли способ, чтобы получить фактический тип вместо динамического прокси Благодаря

EDIT:.? вот пример кода:

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

EDIT: Update 1

Ну, после того, как рыть немного в похоже, GlassMapper делает это так, как я предполагаю, но по какой-то причине это не работает в моем конкретном случае. Что мне недостает? Рекомендации?

+2

Вместо вызова 'GetType()' вы пытались 'if (node ​​MyType)'? http://glass.lu/Mapper/Sc/Tutorials/Tutorial17 – jammykam

+0

Да, я сделал, но это не работает, так как реализация интерфейса каким-то образом скрывается прокси – Hellraiser

+0

Да. это то, что делает GlassMapper - он генерирует свои собственные реализации интерфейса через Castle Windsor. –

ответ

0

Ну, после нескольких дней в этом вопросе я могу подтвердить ответ: не в этом случае. В принципе, это ДОЛЖНО работать. Но в моем случае нет возможности получить реальную реализацию интерфейса. GlassMapper заменяет фактические классы динамической прокси-реализацией интерфейса, объявленного в свойстве «children», поэтому невозможно отбросить каждого ребенка к их фактическим типам.

Это настолько плохо, что не позволяет реализовать целую кучу динамических сценариев. Для этого я создал пользовательский сопоставитель. Но, как я писал ранее, это не работает в этом конкретном случае ТОЛЬКО. Обычно он должен работать.

+0

Я еще не пробовал это в V4, но он определенно работал в V3, так как я лично использовал его точно так же, как я упоминал в своем предыдущем комментарии. Используете ли вы интерфейсы или конкретные классы для ваших моделей стекла? – jammykam

+0

Согласен с jammykam. Я реализую parent.Children.OfType () все время. Вы можете проверить child.GetType(). BaseType, но это не обязательно. – RvanDalen

+0

У вас есть пример этого? Спасибо – Hellraiser

Смежные вопросы