2017-05-07 70 views
2

让我们考虑以下情形的属性:出口使用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初始化详细的实例作为参数。所以,基本上,我需要将Person的特定实例注入到Details构造函数中。

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

+0

我不认为这可能与MEF,您应该创建一个服务,它能够装载一个人的详细信息,然后将该服务导入到详细信息类中。然后,您可以使用person对象中的可用信息从服务中加载正确的信息。即var contactDetail = contactDetailService.Load(person.Id); –

回答

1

简单的答案:您需要导出要注入的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属性只允许一次类中使用。

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

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

而出口的原型

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

谢谢。那正是我所期待的。 –

+0

很高兴我能帮助 - 快乐编码:-) – Fruchtzwerg