在MEF中编写零件后自动调用方法

时间:2011-09-30 20:22:18

标签: .net mef

有没有办法指定在编写零件后自动调用方法?可以在组成部分或执行组合的类中调用该方法。

3 个答案:

答案 0 :(得分:8)

是。如果您的类实现了IPartImportsSatisfiedNotification接口,那么MEF容器将在合适的时间调用OnImportsSatisfied

答案 1 :(得分:3)

采用这种方法会在你的类中引入一个时间耦合 - 它会在正常工作之前以正确的顺序依赖于一些局外人调用方法。

时间耦合是一种主要代码气味 - 它使得重用和理解课程变得更加困难。 (请记住,一个需要从头开始阅读和理解代码的开发人员在六个月内自己。)

相反,你的班级应该对自己的初始化负责 - 它不应该依赖外部的一方。

如果某些步骤需要从构造函数中推迟,则执行此操作的一种方法是将这些步骤移动到私有方法中,然后为每个适当的公共方法添加一个保护步骤,以确保初始化完成。

public class Example 
{
    public Example()
    {
        // Constructor
    }

    public void Open()
    {
        EnsureInitialized();
        ...
    }

    private void EnsureInitialized()
    {
        if (!mInitialized)
        {
            Initialize();
        }
    }

    private void Initialize()
    {
        // Deferred code goes here
    }
}

答案 2 :(得分:1)

根据您的评论,具体问题是只有在通过MEF合成创建类型时才会执行代码。在其他情况下,您希望避免代码执行。

我不确定是否有可以挂钩的特定MEF事件。但是,您可以使用以下模式来解决问题

class MyPart {
  public MyPart() : this(true) {

  }
  private MyPart(bool doMefInit) {
    if (doMefInit) {
      MefInitialize();
    }
  }
  public static MyPart CreateLight() {
    return new MyPart(false);
  }
}

虽然我会质疑这种模式的有效性。如果您的类型具有仅在特定主机方案中有效的代码,则会尖叫该代码应该被分解为2个独立对象。