There isn't an issue about the addition of NHibernate.ByteCode.Unity
Feel free to add it.
Don't forget that one of the responsibility of the implementation of
IProxyFactoryFactory is provides a IProxyValidator (in the IProxyValidator
you can validate the entity type and provide a nice message when the entity
does not have a public ctor).

On Sun, Jul 11, 2010 at 6:21 AM, Dawid <[email protected]> wrote:

> I've created the project, ran the tests, made some changes and came to
> the conclusion that Unity is working for the most part, EXCEPT for 2
> issues:
> 1) Some bits are not marked as Serializeable
> 2) Unity Interception does not like protected constructors. But as
> soon as I mark the constructors as public, the tests pass...
>
> I can't seem to find a Unity issue in JIRA?
>
> Regards,
> Dawid
>
> On Jul 10, 7:21 pm, Dawid <[email protected]> wrote:
> > Thx will do that...
> >
> > JIRA still down??
> >
> > On Jul 10, 2:10 pm, Fabio Maulo <[email protected]> wrote:
> >
> > > Very interesting.
> > > Change the conf of NHibernate Tests project and run all tests with your
> > > UnityBytecode and you will see the result.
> > > btw, please check our JIRA about this issue and then add a zip with all
> > > files needed (in this case could be better than a patch file).
> >
> > > On Fri, Jul 9, 2010 at 5:11 PM, Dawid <[email protected]> wrote:
> > > > Hi,
> >
> > > > Without understanding most of the inner technical details of
> > > > nHibernate, it would seem as if I've gotten Unity Interception to
> work
> > > > as the LazyInitializer.
> >
> > > > Code for the LazyInitializer:
> > > >  class LazyInitializer:  BasicLazyInitializer, IInterceptionBehavior
> > > >  {
> > > >    public bool _constructed;
> >
> > > >    public LazyInitializer(string entityName, Type persistentClass,
> > > > object id, MethodInfo getIdentifierMethod, MethodInfo
> > > > setIdentifierMethod, IAbstractComponentType componentIdType,
> > > > ISessionImplementor session)
> > > >      : base(entityName, persistentClass, id, getIdentifierMethod,
> > > > setIdentifierMethod, componentIdType, session)
> > > >    {
> > > >    }
> >
> > > >    public IMethodReturn Invoke(IMethodInvocation input,
> > > > GetNextInterceptionBehaviorDelegate getNext)
> > > >    {
> > > >      var result = input.CreateMethodReturn(null);
> > > >      if (_constructed)
> > > >      {
> >
> > > >        var args = new object[input.Arguments.Count];
> > > >        input.Arguments.CopyTo(args, 0);
> > > >        result.ReturnValue = base.Invoke((MethodInfo)input.MethodBase,
> > > > args, input.Target);
> > > >        if (result.ReturnValue == InvokeImplementation)
> > > >        {
> > > >          //var input2 = new
> > > > VirtualMethodInvocation(GetImplementation(), input.MethodBase,
> > > > input.Arguments);
> > > >          result =
> > > > input.CreateMethodReturn(input.MethodBase.Invoke(GetImplementation(),
> > > > args));
> > > >        }
> > > >      }
> > > >      return result;
> > > >    }
> >
> > > >    public IEnumerable<Type> GetRequiredInterfaces()
> > > >    {
> > > >      return new[] {typeof (INHibernateProxy)};
> > > >    }
> >
> > > >    public bool WillExecute
> > > >    {
> > > >      get { return true; }
> > > >    }
> >
> > > > Code for the Proxy Factory:
> > > >  class UnityProxyFactory: AbstractProxyFactory
> > > >  {
> > > >    public override INHibernateProxy GetProxy(object id,
> > > > ISessionImplementor session)
> > > >    {
> > > >      INHibernateProxy proxy;
> > > >      try
> > > >      {
> > > >        LazyInitializer initializer = new LazyInitializer(EntityName,
> > > > PersistentClass, id, GetIdentifierMethod, SetIdentifierMethod,
> > > > ComponentIdType, session);
> > > >        object obj2 = IsClassProxy
> > > >                        ?
> > > > Intercept.NewInstanceWithAdditionalInterfaces(PersistentClass, new
> > > > VirtualMethodInterceptor(),
> >
> > > > new[] {initializer}, Interfaces)
> > > >                        :
> > > > Intercept.NewInstanceWithAdditionalInterfaces(Interfaces[0], new
> > > > VirtualMethodInterceptor(),
> >
> > > > new[] {initializer}, Interfaces);
> > > >        initializer._constructed = true;
> > > >        proxy = (INHibernateProxy)obj2;
> > > >      }
> > > >      catch (Exception exception)
> > > >      {
> > > >        //log.Error("Creating a proxy instance failed", exception);
> > > >        throw new HibernateException("Creating a proxy instance
> > > > failed", exception);
> > > >      }
> > > >      return proxy;
> >
> > > >    }
> > > >  }
> >
> > > > Any comments / ideas? What sort of unit tests is required to make
> sure
> > > > that Unity Interception is actually working correctly?
> >
> > > > Regards,
> > > > Dawid Mostert
> >
> > > --
> > > Fabio Maulo
>



-- 
Fabio Maulo

Reply via email to