You can export a Func<> and then call it. Like this:

class BarFactory
{
   [Import]
   IBlah blah;

   [Export(typeof(Func<IBar>))]
   IBar CreateBar()
   {
       return new Bar(blah);
   }
}

class BarProvider
{
  [Import]
  private Func<IBar> _factory;

  [Export]
  public IBar Bar { get { return _factory.Invoke(); } }
}

Michael M. Minutillo
Indiscriminate Information Sponge
http://codermike.com


On Sat, Sep 10, 2011 at 7:38 PM, Matt Siebert <mlsieb...@gmail.com> wrote:

> I kind of like this approach, but does MEF allow an Export on a method? If
> so then I suppose I could do something like:
>
> class BarFactory
> {
>    [Import]
>    IBlah blah;
>
>    [Export]
>    IBar CreateBar()
>    {
>        return new Bar(blah);
>    }
> }
>
> I can see how imports could be handled with David's approach though.
>
> Thanks.
>
>
> On Saturday, September 10, 2011, Michael Minutillo <
> michael.minuti...@gmail.com> wrote:
> > One solution would be to add the following class to Foo.dll but it means
> you're controlling the creation of Bar instead of getting MEF to do it for
> you
> > class BarProvider
> > {
> >   [Export(typeof(IBar))]
> >   IBar ExportedBar = new Bar();
> > }
> >
> >
> > Michael M. Minutillo
> > Indiscriminate Information Sponge
> > http://codermike.com
> >
> >
> > On Fri, Sep 9, 2011 at 2:33 PM, Matt Siebert <mlsieb...@gmail.com>
> wrote:
> >>
> >> Hey folks,
> >> I'm beginning to use MEF in a solution that involves a mix of .NET 3.5
> and 4.0 projects.  I'm using MEF in the 4.0 projects and I need to register
> some exports that live in the 3.5 projects.  The problem is I need to do
> this from one of the plugin projects.
> >> To illustrate this, imagine a console application such as...
> >>
> >>     class Program
> >>     {
> >>         static void Main(string[] args)
> >>         {
> >>             var program = new Program();
> >>
> >>             var catalog = new DirectoryCatalog(".");
> >>             using (var container = new CompositionContainer(catalog))
> >>             {
> >>                 var batch = new CompositionBatch();
> >>                 batch.AddPart(program);
> >>                 container.Compose(batch);
> >>
> >>                 program.Test();
> >>             }
> >>         }
> >>
> >>         [Import]
> >>         private IFoo foo = null;
> >>
> >>         public void Test()
> >>         {
> >>             Console.WriteLine(foo.Bar);
> >>         }
> >>     }
> >>
> >> IFoo is in another DLL with a concrete implementation...
> >>
> >>     public interface IFoo
> >>     {
> >>         string Bar { get; }
> >>     }
> >>
> >>     [Export(typeof(IFoo))]
> >>     public class Foo : IFoo
> >>     {
> >>         [Import]
> >>         private IBar bar;
> >>
> >>         public string Bar
> >>         {
> >>             get { return "Beer " + bar.Foo; }
> >>         }
> >>     }
> >>
> >> and finally, IBar is in a .NET 3.5 DLL that isn't using MEF...
> >>
> >>     public interface IBar
> >>     {
> >>         string Foo { get; }
> >>     }
> >>
> >>     public class Bar : IBar
> >>     {
> >>         public string Foo
> >>         {
> >>             get { return "me"; }
> >>         }
> >>     }
> >>
> >> Is there a way to register an IBar export without the console
> application referencing Bar.dll?
> >> Foo.dll has a reference to Bar.dll and could register the export, but in
> order to do this composition must occur first (so that the app can discover
> Foo.dll) and that will fail since Foo's IBar import can't be satisfied.
> >> Cheers.
> >
>

Reply via email to