运行时激活的类中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




