One for each then, thanks guys! :) On Mon, Feb 9, 2009 at 9:28 PM, Steven Harman <stevehar...@gmail.com> wrote:
> Seeing this new way, I think I'd much prefer it to using inheritance. I've > really started to realize that inheritance is rarely the optimal solution to > a problem - often its simply the one we are most comfy with, and so we > naturally go there first. > > So, I guess what I'm saying is... I'd rather see the extension method way, > as it adds a nice point of extension, while allowing us to leverage > composition to build really dynamic and granular mapping overrides. Or at > least, that's my gut reaction. > > Thanks all, > -steve > > //---- 90% of being smart is knowing what you're dumb at ----// > http://stevenharman.net/ > > > On Mon, Feb 9, 2009 at 3:27 PM, Billy <wmccaffe...@gmail.com> wrote: > >> >> James, >> >> Thank you for my input on the matter; albeit, I'd like it to be >> perfectly known that I'm still getting my feet wet with Fluent >> NHibernate and have a lot to learn on the subject. Personally, I like >> the ability to inherit from AutoMap as it makes the behavior more >> interchangeable with ClassMap behavior. It also makes the mapping >> identical in nature to that of ClassMap without having to introduce >> lambdas, which I see as complicating the matter, if only slightly. >> Finally, it makes it easier to use inheritance to create a grouping of >> overridden mappings. For instance, suppose you want an >> AuditableAutoMap<> base class which inherits from AutoMap<> and >> overrides a number of conventions for any entity that is IAuditable. >> You could than have a concrete MyEntityMapClass which inherits from >> AuditableAutoMap<>, one for each IAuditable entity. This would allow >> you to create an "override group" if you will. >> >> With that said, there are other approaches that could be taken to >> simulate on override grouping via encapsulation rather than via >> inheritance. But it's nice to have the inheritance option, if only >> for organization and consistency with ClassMap. :D When it comes down >> to it, there are decisions that must be made for the integrity of the >> design; if you feel that avoiding AutoMap inheritance is in the best >> interest of the overall design of Fluent NHibernate, then I'm very >> supportive of that decision as well. >> >> Thanks for all your great work on Fluent NHibernate...it's been a big >> hit within S#arp Architecture. >> >> Billy McCafferty >> >> >> On Feb 9, 1:07 pm, James Gregory <jagregory....@gmail.com> wrote: >> > I think what I've been saying may have been interpreted as being more >> > negative or hostile than I intended it to be. My basic point was, there >> > isn't a bug because you aren't using a "feature" of FNH. >> > I'm happy for this to become a proper supported way of overriding >> > automappings, but for me to be expected to support it I have to actually >> > write coverage for it. Until I do that, it's unofficial. >> > >> > As for my stance on actually using it, as long as it's explained that >> they >> > are overrides (and as Steve said, with a decent naming convention) >> there's >> > nothing wrong with inheriting from AutoMap<T>. I'm all for SoC. >> > >> > Billy: do you prefer your new way of writing the overrides, or would you >> > prefer to just inherit from AutoMap? Is this new way just to avoid the >> bug? >> > >> > What I'm saying is: say the word and I'll make this an official feature; >> > then I won't moan about not supporting an unofficial feature. >> > >> > On Mon, Feb 9, 2009 at 7:29 PM, Billy <wmccaffe...@gmail.com> wrote: >> > >> > > Here's the final approach that I took to organize my overrides: >> > >> > > 1) Add an override interface to your application as follows: >> > >> > > using FluentNHibernate.AutoMap; >> > >> > > namespace SharpArch.Data.NHibernate.FluentNHibernate >> > > { >> > > /// <summary> >> > > /// Used by <see cref="AutoPersistenceModelExtensions" /> to add >> > > auto mapping overrides >> > > /// to <see cref="AutoPersistenceModel" /> >> > > /// </summary> >> > > public interface IAutoPeristenceModelConventionOverride >> > > { >> > > AutoPersistenceModel Override(AutoPersistenceModel model); >> > > } >> > > } >> > >> > > 2) Create an extension method, as follows, to look for every class >> > > which implements IAutoPeristenceModelConventionOverride, in a >> > > particular assembly, and apply the override to AutoPersistenceModel: >> > >> > > using FluentNHibernate.AutoMap; >> > > using System.Reflection; >> > > using System; >> > > using SharpArch.Core; >> > >> > > namespace SharpArch.Data.NHibernate.FluentNHibernate >> > > { >> > > /// <summary> >> > > /// Provides a means to override <see cref="AutoPersistenceModel" / >> > > > conventions with classes >> > > /// that implement <see >> > > cref="IAutoPeristenceModelConventionOverride" />. >> > > /// </summary> >> > > public static class AutoPersistenceModelExtensions >> > > { >> > > public static AutoPersistenceModel >> > > MapConventionOverridesFromAssemblyOf<TOverride>( >> > > this AutoPersistenceModel autoPersistenceModel) where >> > > TOverride : IAutoPeristenceModelConventionOverride { >> > >> > > Assembly assemblyToPullConventionOverridesFrom = typeof >> > > (TOverride).Assembly; >> > >> > > foreach (Type type in >> > > assemblyToPullConventionOverridesFrom.GetTypes()) { >> > > if (typeof >> > > (IAutoPeristenceModelConventionOverride).IsAssignableFrom(type)) { >> > > IAutoPeristenceModelConventionOverride instance = >> > > Activator.CreateInstance(type) as >> > > IAutoPeristenceModelConventionOverride; >> > >> > > if (instance != null) >> > > instance.Override(autoPersistenceModel); >> > > } >> > > } >> > >> > > return autoPersistenceModel; >> > > } >> > > } >> > > } >> > >> > > 3) Create a class for each entity that requires a convention override; >> > > for example: >> > >> > > using FluentNHibernate.AutoMap; >> > > using Northwind.Core; >> > > using SharpArch.Data.NHibernate.FluentNHibernate; >> > >> > > namespace Northwind.Data.NHibernateMappings >> > > { >> > > public class CustomerMap : IAutoPeristenceModelConventionOverride >> > > { >> > > public AutoPersistenceModel Override(AutoPersistenceModel >> > > model) { >> > > return model.ForTypesThatDeriveFrom<Customer>(map => { >> > > map.SetAttribute("lazy", "false"); >> > > }); >> > > } >> > > } >> > > } >> > >> > > 4) Include a call to the extension method when setting up the >> > > AutoPersistenceModel; e.g., >> > >> > > AutoPersistenceModel mappings = AutoPersistenceModel >> > > .MapEntitiesFromAssemblyOf<Customer>() >> > > ... >> > > .WithConvention(GetConventions) >> > > .MapConventionOverridesFromAssemblyOf<CustomerMap>(); >> > >> > > I'll be including this approach in the next release of S#arp >> > > Architecture which leverages Fluent NHibernate. Hope this helps! >> > >> > > Billy McCafferty >> > >> > > On Feb 9, 9:03 am, Steven Harman <stevehar...@gmail.com> wrote: >> > > > Being one of the folks currently using the AutoPersistenceModel in >> an >> > > > unconventional (or rather, just unexpected) manner, I suppose I >> should >> > > speak >> > > > up in favor of allowing, and suggesting, that class-specific >> convention >> > > > overrides be split out into their own auto mappings files. I'm on >> board >> > > > w/Andy - this approach keeps things more granular, better seperated, >> and >> > > > easier to grok when you have a large number of mappings. >> > >> > > > That said, I also see James concern that it might not be obvious >> that >> > > these >> > > > small one-off maps are actually overriding some other auto mapping, >> setup >> > > > elsewhere. However, I think some smart naming conventions, >> namespacing, >> > > and >> > > > a little bit of education could go a long way toward eliminating >> that >> > > > concern. But then, that's just my opinion. >> > >> > > > Perhaps talking about the various ways folks are using FNH mappings >> (both >> > > > auto and manual), and the lessons we're learning, would be a good >> topic >> > > for >> > > > a VAN Meeting? >> > >> > > > -steve >> > >> > > > //---- 90% of being smart is knowing what you're dumb at ----// >> > >http://stevenharman.net/ >> > >> > > > On Mon, Feb 9, 2009 at 9:44 AM, AndyStewart < >> andrewnstew...@gmail.com >> > > >wrote: >> > >> > > > > Hi James >> > >> > > > > I've not read the whole thread, so forgive me if I'm going in the >> > > > > wrong direction. However let me shed some light on this, >> > > > > looks like some users of the library are inheriting from AutoMap >> and >> > > > > using the model.addMappingsFromAssembly( ); method. >> > > > > This is in-fact the very first way I wrote automappings, until >> Chad >> > > > > showed me the light to the fluent method. However if >> > > > > your doing alot of custom mappins then loading in via seperate >> classes >> > > > > is a lot cleaner than the 80 lins of fluent code >> > > > > I have in one of my projects (yuk). >> > >> > > > > Hope you this puts you in the picture as how this has come about. >> > >> > > > > Andy >> > >> > > > > On Feb 9, 10:33 am, James Gregory <jagregory....@gmail.com> >> wrote: >> > > > > > Billy, it's important to note that I never said you shouldn't be >> > > deriving >> > > > > > from AutoMap<T>. If that works for you (or did...) then great. >> My >> > > point >> > > > > is >> > > > > > that this style of modeling has evolved without my knowledge, >> which >> > > is >> > > > > > interesting and concerning at the same time; if it's a good >> thing >> > > then I >> > > > > > have no issue with it, but I can't be seen to endorse it without >> > > > > > understanding the implications of it's use beforehand. >> > > > > > For starters, we have no tests covering this code; which leads >> us to >> > > > > > situations like this where I manage to break it for people >> without >> > > ever >> > > > > > knowing. We have no examples promoting this style (unless >> somebody's >> > > > > written >> > > > > > some I wasn't aware of), and as a result we have no way of >> supporting >> > > > > this >> > > > > > from a guidance perspective. >> > >> > > > > > My final disagreement with this is that I don't actually like >> the way >> > > it >> > > > > > feels. It looks like a ClassMap, smells like a ClassMap, but is >> an >> > > > > AutoMap. >> > > > > > You look at it and, unless you already know that it's an >> AutoMap, >> > > think >> > > > > > "where are all the other mappings?" However, that could just be >> me >> > > > > because >> > > > > > I'd not used it in this manner. >> > >> > > > > > All that being said, I can definitely see the merit in >> separating the >> > > > > > overrides into their own classes. People obviously like doing >> > > overrides >> > > > > in >> > > > > > the manner that #arch does them, so presuming I can get the code >> > > under >> > > > > test >> > > > > > (and fix the bug), I have no issue with people proceeding. >> > >> > > > > > I've got some time tomorrow working on FNH, so I'll take a look >> at >> > > this >> > > > > > then. >> > >> > > > > > On Mon, Feb 9, 2009 at 3:16 AM, Billy <wmccaffe...@gmail.com> >> wrote: >> > >> > > > > > > I was also inheriting from AutoMap and ran into the same >> exception >> > > > > > > with recent updates. The workaround that I've put in place >> for >> > > this >> > > > > > > issue for keeping overrides well organized is described at >> > >> > >http://groups.google.com/group/sharp-architecture/msg/c74d493fc74ed98. >> > > > > .. >> > > > > > > . >> > > > > > > Although it's within the context of S#arp Architecture, it >> could be >> > > > > > > reused in any project. >> > >> > > > > > > Billy McCafferty >> > >> > > > > > > On Feb 3, 12:13 pm, Jimit <jimitndi...@gmail.com> wrote: >> > > > > > > > The method MergeWithAutoMapsFromAssembly<T>() seemed to >> suggest >> > > the >> > > > > > > > style I used - that is, subclassing AutoMap<T> in an >> assembly. It >> > > did >> > > > > > > > discover my automaps fine, but then failed with the error >> > > described. >> > > > > > > > My domain has some very deep hierarchies and the fluent >> > > configuration >> > > > > > > > (using ForTypesThatDeriveFrom<T>) was getting rather wordy >> so I >> > > > > > > > seperated them into individual subclasses of AutoMap<T> and >> > > merged >> > > > > > > > them into my AutoPersistenceModel using >> > > > > > > > MergeWithAutoMapsFromAssembly<T>(). It seemed to work fine, >> until >> > > it >> > > > > > > > didn't. :) I think subclassing AutoMap<T> should be >> supported, >> > > if >> > > > > > > > nothing else than for consistency with ClassMap<T> for >> > > non-automapped >> > > > > > > > entities. >> > >> > > > > > > > Speaking of ForTypesThatDeriveFrom<T>, I think a non-generic >> > > overload >> > > > > > > > might come in handy. One use case (that's got me stumped at >> the >> > > > > moment >> > > > > > > > - having to use reflection) is setting conventions for the >> open >> > > form >> > > > > > > > of a generic base type, e.g EntityBase<,>. In my particular >> case, >> > > I >> > > > > > > > want to ignore certain properties in EntityBase<TEntity,TId> >> but >> > > > > don't >> > > > > > > > want to have to tell the Automapper to ignore >> > >> > ... >> > >> > read more ยป >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ 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 fluent-nhibernate+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/fluent-nhibernate?hl=en -~----------~----~----~----~------~----~------~--~---