Hi Paul First patch applied. Cheers
Andy On Wed, Aug 27, 2008 at 11:21 PM, Paul Batum <[EMAIL PROTECTED]> wrote: > Yeah I wanted a few tests specifically for the method on InvocationHelper. > > > On Wed, Aug 27, 2008 at 9:57 PM, Andrew Stewart < > [EMAIL PROTECTED]> wrote: > >> Hi Paul >> >> There's a bunch of integration test's running over that series of code, >> which would test it from an automapping perspective. Maybe worth creating >> some a little more specific though. >> >> Cheers >> >> Andy >> >> On Wed, Aug 27, 2008 at 9:51 PM, Paul Batum <[EMAIL PROTECTED]> wrote: >> >>> Cool. I was a bit lazy and didn't write any tests for that code, I would >>> like to go back and add a few once the patch is applied. >>> >>> >>> On Wed, Aug 27, 2008 at 1:05 PM, Andrew Stewart < >>> [EMAIL PROTECTED]> wrote: >>> >>>> Hi Paul >>>> >>>> I will be applying your patch as the first fix for the problem, however >>>> I've just not had any time yet. I may at somepoint look for a larger >>>> refactoring, but I think one way or another dropping down your method will >>>> be essential at somepoint in the process. >>>> >>>> Cheers >>>> >>>> Andy >>>> >>>> On Tue, Aug 26, 2008 at 9:04 PM, Paul Batum <[EMAIL PROTECTED]>wrote: >>>> >>>>> Hey Andy, >>>>> >>>>> I was wondering if you have decided where to go with this code? I >>>>> thought my patch would be a good option if you don't want to engage in a >>>>> larger refactoring. >>>>> >>>>> Paul Batum >>>>> >>>>> >>>>> On Sun, Aug 17, 2008 at 6:20 PM, Paul Batum <[EMAIL PROTECTED]>wrote: >>>>> >>>>>> Hey Andy, >>>>>> >>>>>> I decided to tackle your problem from a different angle to Chad. It >>>>>> sounds like Chad went to the root of the problem by making non generic >>>>>> methods. I came up with a less fragile way of invoking the generic >>>>>> methods >>>>>> using reflection. My solution replaces this: >>>>>> >>>>>> // Merge Mappings together >>>>>> var findAutoMapMethod = typeof(AutoMapper).GetMethod("MergeMap"); >>>>>> var genericfindAutoMapMethod = >>>>>> findAutoMapMethod.MakeGenericMethod(obj); >>>>>> genericfindAutoMapMethod.Invoke(autoMap, new[] { mapping }); >>>>>> >>>>>> With this: >>>>>> >>>>>> InvocationHelper.InvokeGenericMethodWithDynamicTypeArguments( >>>>>> autoMap, a => a.MergeMap<object>(null), new[] { >>>>>> mapping }, obj); >>>>>> >>>>>> Here is the implementation of that method: >>>>>> >>>>>> public static object >>>>>> InvokeGenericMethodWithDynamicTypeArguments<T>(T target, >>>>>> Expression<Func<T, >>>>>> object>> expression, object[] methodArguments, params Type[] >>>>>> typeArguments) >>>>>> { >>>>>> var methodInfo = ReflectionHelper.GetMethod(expression); >>>>>> if (methodInfo.GetGenericArguments().Length != >>>>>> typeArguments.Length) >>>>>> throw new ArgumentException( >>>>>> string.Format("The method '{0}' has {1} type >>>>>> argument(s) but {2} type argument(s) were passed. The amounts must be >>>>>> equal.", >>>>>> methodInfo.Name, >>>>>> methodInfo.GetGenericArguments().Length, >>>>>> typeArguments.Length)); >>>>>> >>>>>> return methodInfo >>>>>> .GetGenericMethodDefinition() >>>>>> .MakeGenericMethod(typeArguments) >>>>>> .Invoke(target, methodArguments); >>>>>> } >>>>>> >>>>>> This is sturdier because a refactoring of the MergeMap method would >>>>>> flow to the lambda. Obviously it is still somewhat fragile because there >>>>>> is >>>>>> no guarantee that the right number of type arguments is passed, hence the >>>>>> runtime check. >>>>>> >>>>>> The patch is attached to this email. I figure that you will probably >>>>>> want to go down the path that Chad followed, but perhaps this >>>>>> implementation >>>>>> will be useful trick when you don't have the luxury of modifying the API >>>>>> to >>>>>> be non-generic. >>>>>> >>>>>> Paul Batum >>>>>> >>>>>> >>>>>> >>>>>> On Sun, Aug 17, 2008 at 3:28 PM, Andrew Stewart < >>>>>> [EMAIL PROTECTED]> wrote: >>>>>> >>>>>>> Hi Chad >>>>>>> >>>>>>> >>>>>>>> Will this be called directly by people, or is this mostly internal >>>>>>>> API stuff? >>>>>>> >>>>>>> >>>>>>> The crappy code is only internal and tests should now fail if it's >>>>>>> broken, which is nice to know. I think I know what you mean and I'll >>>>>>> try and >>>>>>> tidy that code up shortly, thanks for the offer to pair over this it may >>>>>>> come in useful, but i'd like to have a go at it myself for now. I'll >>>>>>> give >>>>>>> you a shout if I get stuck though, if it's ok with you. >>>>>>> >>>>>>> Cheers >>>>>>> >>>>>>> Andy >>>>>>> >>>>>>> >>>>>>> On Sat, Aug 16, 2008 at 1:02 AM, Chad Myers <[EMAIL PROTECTED]>wrote: >>>>>>> >>>>>>>> I did a spike and got my head around it. Basically, you have a >>>>>>>> bunch of generic methods and then you're treating them non-generically. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Will this be called directly by people, or is this mostly internal >>>>>>>> API stuff? >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> I was able to create an IAutoMap rather than have AutoMap<T>, >>>>>>>> IAutoPartMapper instead of the various part mappers (IAutoMapper was >>>>>>>> confusing because there's an AutoMapper<T>, but it wasn't an >>>>>>>> IAutoMapper, >>>>>>>> IAutoMapper is really something like IAutoPartMapper, etc). >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Anyhow, if you use interfaces for these things and make them >>>>>>>> non-generic (i.e. don't make it Foo<T>, just make methods like Foo(Type >>>>>>>> theType)). >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Make the people-facing fluent interfaces generic <T>, but all the >>>>>>>> internal stuff non-generic otherwise your life will be very painful (as >>>>>>>> you've already found out). >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> I don't want to commit my spike code because it's not tested and >>>>>>>> it's sloppy, but maybe we can pair on this sometime if you want, or if >>>>>>>> you >>>>>>>> want to research this yourself, etc. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -c >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> *From:* fluent-nhibernate@googlegroups.com [mailto: >>>>>>>> [EMAIL PROTECTED] *On Behalf Of *Andrew Stewart >>>>>>>> *Sent:* Friday, August 15, 2008 7:51 AM >>>>>>>> *To:* fluent-nhibernate@googlegroups.com >>>>>>>> *Subject:* [fluent-nhib] Re: Ayende on Fluent nHibernate - AutoMap >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Hello >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> I've just checked this in and it seems to work, >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> var persistenceModel = new >>>>>>>> AutoPersistenceModel(Assembly.GetAssembly(typeof(PlotMap))); >>>>>>>> persistenceModel.AddEntityAssembly(Assembly.GetAssembly(typeof >>>>>>>> (Address)), t => (t.Namespace == "Mdis.Entities" && ( t.BaseType == >>>>>>>> typeof(object)))); >>>>>>>> persistenceModel.Configure(cfg); >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> The first assembly is the assembly containing your maps, the second >>>>>>>> is the assembly containing your entities (I'm assuming you have two >>>>>>>> assemblies for SoC, but there's no reason why these can't be the >>>>>>>> same). Then >>>>>>>> I've created an AutoMap which inherits from ClassMap, this is so I >>>>>>>> don't >>>>>>>> dirty up the base class with my little requirements, essentially what >>>>>>>> properties have already been mapped(to prevent duplication). >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Example >>>>>>>> >>>>>>>> public class PlotMap : AutoMap<Plot> >>>>>>>> { >>>>>>>> public PlotMap() >>>>>>>> { >>>>>>>> HasManyToMany<Service>(p => p.Services); >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> What happens is, first it loads in your automap's then in maps in >>>>>>>> extra unmapped properties and entities(hope that makes sense). So you >>>>>>>> only >>>>>>>> need to specify exceptions to the rule everything else will be mapped >>>>>>>> straight out the box as if by magic. Now my next challenge will be >>>>>>>> making >>>>>>>> this a bit more fluent and specifying conventions across the board as >>>>>>>> of >>>>>>>> Chad's suggestion below: >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> var model = AutoPersistenceModel >>>>>>>> .MapEntitiesFromAssemblyOf<AutoMapTests>() >>>>>>>> .Where(t => t.Namespace == "FluentNHibernate.AutoMap.Test") >>>>>>>> .ForTypesThatDeriveFrom<DomainEntity>(map => >>>>>>>> { >>>>>>>> >>>>>>>> map.UseIdentityForKey(e => e.Id, "Id"); >>>>>>>> }); >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Plus if anyone can think of a nice way to replace the contents of >>>>>>>> AutoPersistanceModel.AddEntityAssembly, which strict typing let me >>>>>>>> know. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Hope you like it, so far. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Andy >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>> >>>>> >>>>> >>>>> >>>>> >>> >>> >>> >>> > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Fluent NHibernate" group. To post to this group, send email to fluent-nhibernate@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/fluent-nhibernate?hl=en -~----------~----~----~----~------~----~------~--~---