有没有办法指定在编写零件后自动调用方法?可以在组成部分或执行组合的类中调用该方法。
答案 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个独立对象。