You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-cs@ibatis.apache.org by "Nguyen, Tom" <To...@rels.info> on 2006/04/25 19:27:08 UTC

Proxy (AOP) object DataMapping error/feature request

Hi,

 

I'm using Aspect# to proxy Business Objects for various purposes; one of
which is object state tracking.  It's great that IBatis could
instantiate by business object proxy but not without some a little
issue.  Well, you could call it a feature request.

 

// I need IBatisNet to do something like this

public T Retrieve<T>(object parameterObject)

{

return SqlMapper.QueryForObject("SomeStatement", parameter,
ProxyManager.CreateInstance(typeof(T));

}

 

Account c = Retrieve<Account>(parameterObject);

 

Issue:

            Proxy object can contain multiple same name properties
(aspect weaving) that causes Ibatis property cache to throw an exception
at: ReflectionInfo.AddPropertiess(Type type) 

 

                                    PropertyInfo[] properties =
type.GetProperties(BINDING_FLAGS_SET);

                                    for (int i = 0; i <
properties.Length; i++) 

                                    {

                                                string name =
properties[i].Name;

 
_setProperties.Add(name, properties[i]);

                                                _setTypes.Add(name,
properties[i].PropertyType);

 

                                    } ...

 

 

Example:

public class Account

{

            public virtual double Balance { get; set; } 

}

Account a = new Account();

a.GetPropertyes() - Balance (type: Account)

 

Account b = ProxyFactory.CreateInstance(typeof(Account));

B.GetProperties() - [0] Balance (type: Account), [1] Balance (type:
CProxyAccount_IPersistable...)

            

                        The code error at "_setProperties.Add(name,
properties[i])" : Exception ~ key already exist.

 

            

            Added:

                        In order to support Proxy object mapping, I
commented out line 312 - 315 in ResultMap.cs: 

                                                /*if ( target.GetType()
!= _class )

                                                {

                                                            throw new
ArgumentException( "Could not set value of type '"+ target.GetType() +"'
in property '"+property.PropertyName+"' of type '"+_class+"'" );

                                                }*/

 

                        In order to overcome the issue I changed
ReflectionInfo.AddProperties to: 

                                    PropertyInfo[] properties =
type.GetProperties(BINDING_FLAGS_SET);

                                    for (int i = 0; i <
properties.Length; i++) 

                                    {

                                                string name =
properties[i].Name;

 

                                                if
(_setProperties.ContainsKey(name))

                                                {

                                                            // determine
if this is the better key

                                                            if
(properties[i].DeclaringType.Equals(type))

                                                            {

 
_setProperties.Remove(name);

 
_setTypes.Remove(name);

                                                            }

                                                            else

 
continue;

                                                }

                                                _setProperties.Add(name,
properties[i]);

                                                _setTypes.Add(name,
properties[i].PropertyType);

 

                                    }...

            

                        This requires local build of DataMapper and
keeps track of changes.

 

            Request:

 

            Also, I would like something similar for QueryForList...

 

            SqlMapper.QueryForList("SomeStatement", parameter,
dummyValueObject, list) where the IBatisNet use dummyObject type (proxy
type) as object type to add to list...

 

            I.E:

 

            IList<Account> lst = new List<Account>();

            SqlMapper.QueryForList("SomeStatement", parameter,
ProxyManager.CreateInstance(typeof(Account)), lst);

            return lst;

 

Thanks,

Tom Nguyen
Powered By IBatisNet DataMapper v1.3.xxx on .NET 2.0