导入构造函数和子类

本文关键字:子类 构造函数 导入 | 更新日期: 2023-09-27 18:31:41

我有一个抽象基类和一个派生类。我正在尝试使用 MEF 在基类中使用 [ImportingConstructor] 注入对我的窗口管理器的引用。即。

[ImportingConstructor]
public SomeViewModel(IWindowManager windowmanager) {...}

问题是,在我添加这个之前,我所拥有的只是没有参数构造函数,并且派生类正在编写 如果我向基类添加无参数构造函数,则永远不会注入 WindowManager。

利用我目前有限的知识,我能想到的唯一方法是将管理器导入更改为属性导入,并且只有一个无参数的默认构造函数。这让我很烦恼,因为一般规则似乎更喜欢构造函数注入所需的依赖项,而属性注入则适合可选依赖项。

我可以在我的子类中添加覆盖 [ImportingConstructor],但这似乎是不必要的代码重复。

有没有更好的方法来做到这一点,即确保在创建派生类时注入我的依赖项?

导入构造函数和子类

暂时忽略 MEF 并考虑一下:

public abstract class BaseClass {
    protected BaseClass(IService service) { }
}
public class SubClass : BaseClass {
    public SubClass(IService service) : base(service) { }
}
由于基类

定义单个构造函数,因此子类必须通过为基类的构造函数提供参数来初始化基类。

现在,对于MEF,我认为您要做的是:

public abstract class BaseClass {
    [ImportingConstructor]
    protected BaseClass(IService service) { }
}
[Export]
public class SubClass : BaseClass {
    public SubClass() { }
}

听起来你试图向基类的构造函数注入一些东西,但你不能这样做,因为子类的责任是确保将适当的参数传递给构造函数的基类。 您需要对子类进行修改:

[Export]
public class SubClass : BaseClass {
    [ImportingConstructor]
    public SubClass(IService service) : base(service) { }
}

现在,子类将注入服务并将其传递给基类。

在使用属性注入与构造函数注入方面:最好将类型初始化为可用状态。构造函数中应该需要任何显式依赖项。但是,由于 MEF 将满足所有导入,因此当你从容器中取回部件时,构造函数和属性注入都已发生,因此你可能会改用属性导入。我的偏好一直是使用构造函数导入。