Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Export a property using MEF

Let us consider the following scenario:

class Master
{
    private Person selectedPerson;

    public Person SelectedPerson
    {
        get
        {
            return selectedPerson;
        }
        set
        {
            selectedPerson = value;

        }
    }

}

[Export(typeof(Details))]
class Details
{
    [ImportingConstructor]
    public Details(Person person)
    {

    }
}

I need to initialise an instance of Details with SelectedPerson as argument. So, basically, I need to inject a particular instance of Person to the Details constructor.

How can I do that using MEF?

like image 774
Sabyasachi Mukherjee Avatar asked Aug 02 '26 08:08

Sabyasachi Mukherjee


1 Answers

Simple answer: You need to export the Person you want to inject. Here is a basic example of a possible console application:

public class Program
{
    [Export(typeof(Person))]
    private Person personToInject { get; set; }

    public static void Main(string[] args)
    {
        new Program().Run();
    }

    private void Run()
    {
        var catalog = new DirectoryCatalog(".");
        var container = new CompositionContainer(catalog);

        //Create the person to inject before composing
        personToInject = new Person();        

        container.ComposeParts(this);
    }
}

Note that the ImportingConstructor attribute is only allowed to use once a class.

To improve the solution you should use names to identify the properties to inject. Therefore you have to extend the prototype of your constructor

[ImportingConstructor]
public Details([Import("personParameter")]Person person)

and your export

[Export("personParameter")]
private Person personToInject { get; set; }
like image 78
Fruchtzwerg Avatar answered Aug 03 '26 22:08

Fruchtzwerg