如何使RegistrationBuilder实际工作?

时间:2015-07-03 18:38:39

标签: c# .net mef

多年来,我在几个项目中使用了MEF,今天我在阅读这些文章后发现:

Managed Extensibility Framework Improvements in .NET 4.5MEF in .NET 4.5

在.NET 4.5中,Microsoft为MEF2添加了一些很酷的功能;像RegistrationBuilder一样。但是,对于我的生活,我无法得到以下非常简单的例子。

public class Person
{
    public string Name { get; private set; }
}

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

    public Program()
    {
        var conventions = new RegistrationBuilder();
        conventions.ForType<Person>().Export();
        conventions.ForType<Program>().ImportProperty(p => p.Person);

        var category = new AssemblyCatalog(Assembly.GetExecutingAssembly());
        var container = new CompositionContainer(category, CompositionOptions.DisableSilentRejection);

        container.SatisfyImportsOnce(this, conventions);
    }

    public Person Person { get; set; }
}

从我读到的内容来看,它看起来应该只是起作用,但它并没有。为了验证它是否可行,我将[Export]属性添加到Person

[Export]
public class Person {...}

和Program.Person属性的[Import]属性

[Import]
public Person Person { get; set; }

它有效!好的,但是当我尝试使用RegistrationBuilder类时,为什么它不起作用呢?

1 个答案:

答案 0 :(得分:1)

<强>答案:

将约定变量必须添加到目录和SatisfyImportsOnce函数中!

像这样:

var category = new AssemblyCatalog(Assembly.GetExecutingAssembly(), conventions);
var container = new CompositionContainer(category, CompositionOptions.DisableSilentRejection);

container.SatisfyImportsOnce(this, conventions);

希望这有帮助。