ExportFactory Question

Jul 14, 2012 at 5:36 AM
Edited Jul 17, 2012 at 2:25 PM

I am new to MEF and experimenting with ExportFactory.  Can I use ExportFactory to create a list<IFoo> based on user insertion of objects?  A sample would be something similar to what is shown below.  I am probably not understanding the use of ExportFactory because during runtime I get an error shown below during composition. 

1) No valid exports were found that match the constraint '((exportDefinition.ContractName == "System.ComponentModel.Composition.ExportFactory(CommonLibrary.IFoo)") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "System.ComponentModel.Composition.ExportFactory(CommonLibrary.IFoo)".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))', invalid exports may have been rejected.

 


    class Program
    {
        static void Main(string[] args)
        {
            Test mytest = new Test();
        }
    }

    public class Test : IPartImportsSatisfiedNotification
    {
        [Import]
        private ExportFactory<IFoo> FooFactory { get; set; }

        public Test()
        {
            CompositionInitializer.SatisfyImports(this);
            CreateComponent("Amp");
            CreateComponent("Passive");
        }

        public void OnImportsSatisfied()
        {
            int i = 0;
        }

        public void CreateComponent(string name)
        {
            var componentExport = FooFactory.CreateExport();
            var comp = componentExport.Value;
            // What do I do next?
        }
    }

    public interface IFoo
    {
        double Name { get; set; }
    }

    [ExportMetadata("CompType", "Foo1")]
    [Export(typeof(IFoo))]
    [PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)]
    public class Foo1 : IFoo
    {
        public double Name { get; set; }
        public Foo1()
        {

        }
    }

    [ExportMetadata("CompType", "Foo2")]
    [Export(typeof(IFoo))]
    [PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)]
    public class Foo2 : IFoo
    {
        public double Name { get; set; }
        public Foo2()
        {
        }
    }
Jul 19, 2012 at 9:01 PM

I got it working.  No need to reply

Jul 19, 2012 at 11:06 PM

Glad to hear it, thanks for following up!

Nick