2015-07-03 2 views
0

На протяжении многих лет я использовал MEF над несколькими проектами, и сегодня я обнаружил, после прочтения этих статей:Как я могу заставить RegisterBuilder работать на самом деле?

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

Из того, что я читал, похоже, что он должен просто работать, но это не так. Для того, чтобы убедиться в том, что он должен работать, я добавил [Экспорт] атрибут Person

[Export] 
public class Person {...} 

и атрибут [Import] свойству Program.Person

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

И это сработало! Хорошо, но почему бы не работать, когда я пытался использовать только класс RegistrationBuilder?

ответ

1

Ответ:

конвенций переменная должны быть добавлены как к каталогу и функции SatisfyImportsOnce!

Как так:

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

container.SatisfyImportsOnce(this, conventions); 

Надеется, что это помогает.