使用 MEF 导出 属性

Export a property using MEF

让我们考虑以下场景:

class Master
{
    private Person selectedPerson;

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

        }
    }

}

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

    }
}

我需要用 SelectedPerson 作为参数初始化 Details 的实例。所以,基本上,我需要将 Person 的特定实例注入 Details 构造函数。

我如何使用 MEF 做到这一点?

简单的回答:你需要导出你想要注入的Person。这是一个可能的控制台应用程序的基本示例:

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);
    }
}

请注意 ImportingConstructor 属性只允许使用一次 class。

要改进解决方案,您应该使用名称来标识要注入的属性。因此,您必须扩展构造函数的原型

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

和您的导出

[Export("personParameter")]
private Person personToInject { get; set; }