【问题标题】:Export a property using MEF使用 MEF 导出属性
【发布时间】:2017-10-05 18:37:30
【问题描述】:

让我们考虑以下场景:

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 做到这一点?

【问题讨论】:

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

标签: c# mef ioc-container


【解决方案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; }

【讨论】:

  • 谢谢。这正是我想要的。
  • 很高兴我能帮上忙 - 编码愉快 :-)
猜你喜欢
  • 2011-02-09
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2011-03-02
相关资源
最近更新 更多