Let me start by saying that I'm in no way criticising MEF, in fact, I'm really keen to use it in my current project.
I'm an outsider looking in - I'm about to start using MEF in my project so that parts can be discovered and composed at runtime. As such, I can't really comment (yet) on explicit differences between MEF and other DI/IoC containers. That said, being new to MEF, I'm trying to get a feel for where it fits with other DI/IoC containers and most of the information I've found, although maybe dated, indicates that they're fundamentally aimed at solving different problems but there is some overlap due to the similarities of the problems they're trying to solve. The key thing about this from everything I've read is that (at least at the time it was written) there was some debate about whether to use MEF alone or in combination with some other container - in which case how should they be combined? The adapter approach mentioned by Nick (Autofac) seems very powerful. I can also see benefits in keeping them separate (i.e. Autofac/Unity/whatever for the core and MEF for plugins). Given what you've said, it seems that the approach is to evolve MEF to include similar features to the other DI/IoC containers, and this would certainly make it easier to choose just MEF for a given project. That said, for my project I need something now. At this point, the only thing I don't like about using MEF alone is sprinkling [import]s and [export]s throughout the code, whereas other containers can be used while keeping the dependency on the specific container fairly localised. That said, I think it would be fairly rare to have to switch from one container to another. On Fri, Aug 26, 2011 at 11:27 AM, David Kean <[email protected]>wrote: > Everyone’s opinion on what defines an IoC container differs - even guys > well known in the DI area don’t agree on what makes an IoC container. I know > this because we involved a lot of them throughout the development of MEF – > some worked on our team, Nick (Autofac) and Hammet (Windsor), and others > were on the MEF insiders group that we used to call monthly.**** > > ** ** > > Where do you think Nick got the inspiration for that relationship zoo post > he blogged about? MEF has a representation for every one of those dependency > relationships, Autofac actually added some of them *after* MEF. J **** > > ** ** > > I’m actually using MEF as my mainline IoC container. In the next update of > MEF (I believe we’ve got a preview drop on the codeplex site), some of the > major things missing have been added in the box (open generics, fluent > interface – registration builder), factories and parameterized construction > have been there since day v1, ExportFactory was added to v2 (Silverlight). > **** > > ** ** > > When I do find things that are missing, I usually just end up writing an > ExportProvider or Catalog that enables it. For example, we have a bunch of > legacy IServiceProvider provided services in VS – I plugged in my own > ExportProvider, now all of sudden I can start [Import]ing them, and not have > my components touch the IServiceProvider.**** > > ** ** > > We don’t have AOP, and I don’t think we’ll ever add it – we of the opinion > that this sort of thing needs to happen at compile time (think in PostSharp, > CCI, and compiler-as-a-service terms), not at runtime. Lifetime is limited, > but we wanted to keep it that way. What do you think is missing? Blast away > and I’ll file some suggestions internally.**** > > ** ** > > *From:* [email protected] [mailto: > [email protected]] *On Behalf Of *Matt Siebert > *Sent:* Thursday, August 25, 2011 6:04 PM > > *To:* ozDotNet > *Subject:* Re: Anyone using Prism?**** > > ** ** > > I agree. This issue is discussed several times on MEF's CodePlex site:*** > * > > ** ** > > http://mef.codeplex.com/discussions/35083**** > > http://mef.codeplex.com/discussions/43823**** > > http://mef.codeplex.com/discussions/43424**** > > ** ** > > Admittedly, these may be a little dated but some of Glenn Block's comments > are very enlightening.**** > > ** ** > > The following post is also worth reading:**** > > > http://blogs.msdn.com/b/nblumhardt/archive/2009/03/16/hosting-mef-extensions-in-an-ioc-container.aspx > **** > > ** ** > > On Fri, Aug 26, 2011 at 10:24 AM, Jake Ginnivan <[email protected]> > wrote:**** > > I don’t agree that both MEF and Autofac are IoC containers. Sure they both > perform dependency injection, but MEF was never designed to solve the same > issues that today’s IoC containers solve. MEF is more about architecture and > extensibility, where the IoC containers help us manage a set of static > resources and relationships between those resources.**** > > Mef has no support for Open Generics, Automatic factories, parameterised > construction, AOP and the lifetime support is more basic.**** > > **** > > I would use mef to discover, and let me know when there are more modules, > then use new ContainerBuilder().. register new components, > _container.Update(containerBuilder);**** > > **** > > Regards,**** > > *Jake Ginnivan > *Readify | Senior Developer | MVP (VSTO)**** > > M: +61 403 846 400 | E: [email protected] | W: www.readify.net**** > > **** > > *From:* [email protected] [mailto: > [email protected]] *On Behalf Of *David Kean > *Sent:* Thursday, 25 August 2011 10:58 PM**** > > > *To:* ozDotNet > *Subject:* RE: Anyone using Prism?**** > > **** > > I would either use MEF or I would use Autofac. I wouldn’t mix them > together. They are both IoC containers, and are both around to solve the > same problems.**** > > **** > > I personally use MEF, but I worked on it so I’m a little bias. I would use > MEF if you don’t want to take a dependency on something outside of the > framework, otherwise, I would evaluate all the good IoC containers (Castle > Windsor, StructureMap, Autofac, Unity) out there and pick the one you feel > most comfortable with. **** > > **** > > *From:* [email protected] > [mailto:[email protected]] *On Behalf Of *Matt Siebert > *Sent:* Thursday, August 25, 2011 5:44 AM > *To:* ozDotNet > *Subject:* Re: Anyone using Prism?**** > > **** > > Take a look at http://code.google.com/p/autofac/wiki/MefIntegration > > It's not a tutorial but shows how you could use MEF with Autofac. > > I haven't tried it yet but I'm about to start using MEF (and probably > Autofac too) in my current project. > > On Thursday, August 25, 2011, Kirsten Greed <[email protected]> > wrote: > > Thanks Jake > > > > Do you know of any good tutorials on MEF and Autofac? > > > > Kirsten > > > > > > > > ________________________________ > > > > From: [email protected] [mailto: > [email protected]] On Behalf Of Jake Ginnivan > > Sent: Thursday, 25 August 2011 1:50 PM > > To: ozDotNet > > Subject: RE: Anyone using Prism? > > > > > > > > Quite good timing actually, here is a post which backs up my point about > staying away from unity if you want a well performing app: > > > > > > > > http://philipm.at/2011/0808/ > > > > > > > > Another negative side effect of Prism is that modules have a single Run > method. Which you have to do your container registrations and resolve your > dependencies. > > > > > > > > Internally when you resolve, if you have performed any registrations > since you last resolved the container has to rebuild it’s dependency tree, > which is costly. Autofac forces you to create a ContainerBuilder then build > the container from that, so you mentally separate registration and > resolutions, this has the advantage that Autofac does not have to lock the > container when you perform a Resolve, reducing contention and once again > speeding the container up. Unity has to lock on all operations. > > > > > > > > Regards, > > > > Jake Ginnivan > > Readify | Senior Developer | MVP (VSTO) > > > > M: +61 403 846 400 | E: [email protected] | W: www.readify.net < > http://www.readify.net/> > > > > > > > > From: [email protected] [mailto: > [email protected]] On Behalf Of J **** > > ** ** >
