Sorry, you need to specify the type when importing a Func<>, you can't leave
it blank as I did in my example code (serves me right for not trying it
before posting)

On Sat, Sep 10, 2011 at 8:31 PM, Michael Minutillo <
michael.minuti...@gmail.com> wrote:

> 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