2015-09-14 2 views
0

Этот вопрос связан с моим previous question.Auto mapper не может отобразить Замок Active Record Proxy для нескольких типов назначения

Я закончил реализацию AutoMapper по всему моему приложению, и я дошел до одной карты, которая в особых обстоятельствах не работает.

Я собрал единичный тест с некоторыми поддельными классами, которые могут каждый раз воспроизводить проблему, сам тест устройства имеет некоторую настройку, которая настраивает ActiveRecord для работы с базой данных в памяти, которую я здесь не включил (пусть я знаю, может ли это быть релевантным).

Вот тестовый модуль:

[Test] 
public void SandBox() 
{ 
    Mapper.CreateMap<TestDbParty, TestCustomer>(); 
    Mapper.CreateMap<TestDbParty, TestLazyCustomer>(); 

    string customerId; 
    using (Transaction.CreateParticipant()) 
    { 
     var dbCustomer = new TestDbParty(); 
     dbCustomer.Save(); 
     customerId = dbCustomer.Id; 

    } 
    using (var uow = Transaction.CreateParticipant()) 
    { 
     var dbCustomer = TestDbParty.Find(customerId); 
     var customer = Mapper.Map<TestCustomer>(dbCustomer); 
     var lazyCustomer = Mapper.Map<TestLazyCustomer>(dbCustomer); 
    } 
} 

//Fake classes for unit test 

public class TestCustomer 
{} 

public class TestLazyCustomer : TestCustomer 
{} 

[ActiveRecord("PARTY", Lazy = true)] 
public class TestDbParty : DbActiveRecord<TestDbParty> 
{ 
    [PrimaryKey(PrimaryKeyType.Sequence, "ID", SequenceName = "PARTY_ID_SQ")] 
    public virtual string Id { get; set; } 
} 

Transaction.CreateParticipant является оболочкой для настройки SessionScope, здесь реализация:

return new ActiveRecordTransactionParticipant((TransactionScope)SessionScope.Current 
?? new TransactionScope()) 

Последняя строка теста выбросит следующее исключение:

System.InvalidCastException : Unable to cast object of type 'MyProject.TestCustomer' 
to type 'MyProject.TestLazyCustomer'. 

Теперь, если тест изменен для отображения только на LazyCust omer работает так, как ожидалось, или если вызовы карты перемещаются в первую транзакцию, с которой они работают, переупорядочивая две линии, чтобы сначала отображался ленивый клиент.

Мое предположение заключается в том, что прокси-сервер Castle каким-то образом вызывает это, но я не могу понять, как и как я могу надежно исправить это.

Edit: я ставлю точку останова на неисправной линии и побежал dbCustomer.GetType() в ближайшем окне, это возвращается Castle.Proxies.TestDbPartyProxy так, что кажется, подтверждает мое подозрение, по крайней мере частично, отображение будет работать нормально, когда они находятся в том же потому что объект infact экземпляр TestDbParty, а не прокси.

Это определенно проблема, после удаления Lazy=true на классе TestDbParty тест работает нормально.

ответ

0

Это оказалось ошибкой в ​​автоматическом Mapper точные критерии, воспроизводящие следующим образом:

Maps необходимо сопоставить с типом источника, что объект во время выполнения происходит от, в случае примера является тип активного прокси-сервера, который используется во время выполнения.

Должно существовать как минимум два возможных типа назначения, один из которых должен наследовать другой.

И, наконец, проблема возникает только при первом сопоставлении с базовым классом назначения, а затем с производным назначением, и это связано с используемым механизмом кэширования карты.

Для этого был создан git hub issue.

Я не знаю о возможных проблемах в этой проблеме.

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