多年来,我在几个项目中使用了MEF,今天我在阅读这些文章后发现:
Managed Extensibility Framework Improvements in .NET 4.5 和 MEF 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类时,为什么它不起作用呢?
答案 0 :(得分:1)
<强>答案:强>
将约定变量必须添加到目录和SatisfyImportsOnce函数中!
像这样:
var category = new AssemblyCatalog(Assembly.GetExecutingAssembly(), conventions);
var container = new CompositionContainer(category, CompositionOptions.DisableSilentRejection);
container.SatisfyImportsOnce(this, conventions);
希望这有帮助。