List Info

Thread: Proxy (AOP) object DataMapping error/feature request




Proxy (AOP) object DataMapping error/feature request
user name
2006-04-25 17:27:08

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:

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

 

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

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

 &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; {

 &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp;  string name = properties[i].Name;

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

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

 

 &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; } …

 

 

Example:

public class Account

{

 &nbsp; &nbsp; &nbsp; &nbsp;   ; public virtual double Balance { get; set; }

}

Account a = new Account();

a.GetPropertyes() 211; Balance (type: Account)

 

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

B.GetProperties() 211; [0] Balance (type: Account), [1] Balance (type: CProxyAccount_IPersistable…)

 &nbsp; &nbsp; &nbsp; &nbsp;   ;

 &nbsp; &nbsp; &nbsp; &nbsp;   ;  &nbsp; &nbsp; &nbsp;   ; &nbsp; The code error at “_setProperties.Add(name, properties[i])” : Exception ~ key already exist.

 

 &nbsp; &nbsp; &nbsp; &nbsp;   ;

 &nbsp; &nbsp; &nbsp; &nbsp;   ; Added:

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ;  In order to support Proxy object mapping, I commented out line 312 – 315 in ResultMap.cs:

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp;  /*if ( target.GetType() != _class )

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp;  {

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

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp;  }*/

 

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

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

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

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; {

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp;  string name = properties[i].Name;

 

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp;  if (_setProperties.ContainsKey(name))

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp;  {

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; // determine if this is the better key

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; if (properties[i].DeclaringType.Equals(type))

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; {

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp;  _setProperties.Remove(name);

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp;  _setTypes.Remove(name);

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; }

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; else

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp;  continue;

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp;  }

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

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

 

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; }…

 &nbsp; &nbsp; &nbsp; &nbsp;   ;

 &nbsp; &nbsp; &nbsp; &nbsp;   ; &nbsp; &nbsp; &nbsp; &nbsp;   ;  This requires local build of DataMapper and keeps track of changes.

 

 &nbsp; &nbsp; &nbsp; &nbsp;   ; Request:

 

 &nbsp; &nbsp; &nbsp; &nbsp;   ; Also, I would like something similar for QueryForList…

 

 &nbsp; &nbsp; &nbsp; &nbsp;   ; SqlMapper.QueryForList(“SomeStatement”, parameter, dummyValueObject, list) where the IBatisNet use dummyObject type (proxy type) as object type to add to list…;

 

 &nbsp; &nbsp; &nbsp; &nbsp;   ; I.E:

 

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

 &nbsp; &nbsp; &nbsp; &nbsp;   ; SqlMapper.QueryForList(“SomeStatement”, parameter, ProxyManager.CreateInstance(typeof(Account)), lst);

 &nbsp; &nbsp; &nbsp; &nbsp;   ; return lst;

 

Thanks,

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

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )