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 <[email protected]> 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 <
> [email protected]> 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 <[email protected]>
> 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.
> >
>