You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

运行时激活的类中MEF Import属性为Null问题求助

问题分析与解决方案

你遇到的核心问题很明确:Activator.CreateInstance手动创建MEF导出类的实例时,绕开了MEF的依赖注入机制,所以类里标记[Import]的属性自然都是null——MEF根本不知道你手动创建了这个实例,也就没法帮你填充这些依赖。

为什么会这样?

MEF的工作逻辑是通过它的CompositionContainer来管理所有导出([Export])和导入([Import])的关系。只有当实例是由MEF容器创建(或者手动通知MEF处理实例的依赖)时,它才会自动扫描并注入所有标记的依赖项。你直接用Activator.CreateInstance相当于跳过了这个环节,实例完全脱离了MEF的管理范围。

正确的解决方式:让MEF容器创建实例

最规范的做法是修改你的对象工厂,让它依赖MEF的CompositionContainer,然后通过容器来获取实例,这样MEF会自动完成依赖注入。

修改后的工厂类示例:

[Export(typeof(IObjectFactory))]
public class ObjectFactory : IObjectFactory
{
    private readonly CompositionContainer _compositionContainer;

    // 通过构造函数注入MEF容器
    [ImportingConstructor]
    public ObjectFactory(CompositionContainer container)
    {
        _compositionContainer = container;
    }

    public IObjectBase GetObject(Type type)
    {
        // 让MEF容器负责创建实例,自动注入依赖
        return _compositionContainer.GetExportedValueOrDefault<IObjectBase>(type);
    }
}

备选方案:手动触发依赖注入(不推荐)

如果因为某些原因你必须用Activator.CreateInstance创建实例,也可以手动调用MEF的方法来填充依赖,但这种方式会跳过MEF的生命周期管理(比如PartCreationPolicy的配置),属于权宜之计:

// 假设你能获取到MEF容器实例
var objectInstance = Activator.CreateInstance(type) as IObjectBase;
_compositionContainer.SatisfyImportsOnce(objectInstance); // 手动让MEF填充Import属性
return objectInstance;

验证你的代码

你的ObjectBase类本身的标记是没问题的:

[Export(typeof(IObjectBase))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ObjectBase : IObjectBase 
{ 
    [Import] public IService SomeService {get; set;} 
}

只要通过MEF容器创建实例,SomeService就会被正确注入。

内容的提问来源于stack exchange,提问作者Joseph Meris

火山引擎 最新活动