2009-12-02 6 views
1

У меня есть старый MonoRail/ActiveRecord. Я тоже занимался некоторыми работами.После обновления до замка Trunk и NHibernate 2.1.0.4000 Мой тест по интеграции завершился. TestDriven.Net

Недавно я решил обновить приложение на замок Магистральные & NHibernate 2.1.0.4000 GA и я теперь найти несколько проблем с ходовых испытаний:

Во-первых - При использовании TestDriven.NET запустить интеграционные тесты которые работают против базы данных, это вообще сбой TestDriven.Net или все тесты завершают выполнение, а затем проверяется TestDriven.Net. Этого не произошло до обновления.

Когда TestDriven.NET падает, вот что будет записано в журнал событий:

ведро Fault 1467169527, тип 1 Название события: APPCRASH Response: Нет в наличии Cab Id: 0

сигнатура проблемы: P1: P2 ProcessInvocation86.exe : 2.22.2468.0 P3: 4a26845c P4: KERNELBASE.dll P5: 6.1.7600.16385 P6: 4a5bdbdf P7: e053534f P8: 0000b727 P9: P10:

Вторая вещь - Исключения в настоящее время регистрируется, когда прокси-классы будучи финализац() 'd, как показано ниже - это, кажется, когда-то это, зарегистрирован пару раз, то есть при сбое TestDriven.Net.

Вот трассировки стека для исключения:

NHibernate.LazyInitializationException:  
Initializing[MyApp.Core.Models.TestExecutionPackage#15d9eb96-faf0-4b4b-9c5c-9cd400065430]-Could not initialize proxy - no Session. 
    at NHibernate.Proxy.AbstractLazyInitializer.Initialize() 
    at NHibernate.Proxy.AbstractLazyInitializer.GetImplementation() 
    at NHibernate.ByteCode.Castle.LazyInitializer.Intercept(IInvocation invocation) 
    at Castle.DynamicProxy.AbstractInvocation.Proceed() 
    at Castle.Proxies.TestExecutionPackageProxy.Finalize() 

То же поведение будет также врезаться MsBuild на нашем CI Server.

Что действительно странно, что в исключениях теории придачу Finalize() следует проглатывать согласно документации MSDN:

http://msdn.microsoft.com/en-us/library/system.object.finalize(VS.71).aspx

Если Доработка или переопределение Доработка бросает исключение, среда выполнения игнорирует исключение, завершает этот метод Finalize и продолжает процесс завершения.

Мысли кто-нибудь?

+0

Я не уверен, что DynamicProxy должен когда-либо переопределять метод 'Finalize' ... в 1-м месте –

ответ

0

Никогда не совсем докопались этого вопроса, но я в конечном итоге реализации довольно элементарную работу вокруг, создавая свою собственную реализацию LazyInitializer, где я проверяю для метода Finalize при Invoke, как показано ниже:

/// <summary> 
/// Invoke the actual Property/Method using the Proxy or instantiate the actual 
/// object and use it when the Proxy can't handle the method. 
/// </summary> 
/// <param name="invocation">The <see cref="IInvocation"/> from the generated Castle.DynamicProxy.</param> 
public virtual void Intercept(IInvocation invocation) 
{ 
    try 
    { 
    if (invocation.Method.Name == "Finalize") 
    { 
     return; 
    } 
    if (_constructed) 
    { 
     // let the generic LazyInitializer figure out if this can be handled 
     // with the proxy or if the real class needs to be initialized 
     invocation.ReturnValue = base.Invoke(invocation.Method, invocation.Arguments, invocation.Proxy); 

     // the base LazyInitializer could not handle it so we need to Invoke 
     // the method/property against the real class 
     if (invocation.ReturnValue == InvokeImplementation) 
     { 
     invocation.ReturnValue = invocation.Method.Invoke(GetImplementation(), invocation.Arguments); 
     return; 
     } 
     else 
     { 
     return; 
     } 
    } 
    else 
    { 
     // TODO: Find out equivalent to CGLIB's 'method.invokeSuper'. 
     return; 
    } 
    } 
    catch (TargetInvocationException tie) 
    { 
    // Propagate the inner exception so that the proxy throws the same exception as 
    // the real object would 
    Exception_InternalPreserveStackTrace.Invoke(tie.InnerException, new Object[] { }); 
    throw tie.InnerException; 
    } 
} 
0

У меня была такая же проблема, когда я перешел на версию 2.1.2 NHibernate. Я изменил Castle для LinFu Proxy, и тогда все сработало хорошо для меня. Надеюсь это поможет.