You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RegistrationBuilder进行MEF导出无法生效的问题求助

MEF RegistrationBuilder注册错误修正

核心问题

你在使用RegistrationBuilder注册服务时,把实现类型和契约类型的调用逻辑写反了,同时存在多余的无效代码。

具体错误点

  • ForType<T>方法需要传入你要注册的服务实现类的类型,你错误传入了接口IService2
  • Export<T>()方法需要传入你对外暴露的服务契约类型,你错误传入了实现类Service2
  • 代码中container.SatisfyImportsOnce(builder)是无效调用,不需要对RegistrationBuilder实例执行注入

修正后代码

static class Program
{
  [STAThread]
  static void Main()
  {
    // export service 2 using registration builder
    var builder = new RegistrationBuilder();
    // 修正:ForType传实现类,Export传要导出的契约接口
    builder.ForType<Service2>().Export<IService2>();

    var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), builder);
    var container = new CompositionContainer(catalog, CompositionOptions.DisableSilentRejection);
    // 去掉多余的SatisfyImportsOnce调用

    // service exported using attribute can be resolved
    var service1 = container.GetExport<IService1>();

    // 现在可以正常解析
    var service2 = container.GetExport<IService2>();
  }
}

// create two dummy services

public interface IService1 { }

public interface IService2 { }

// export service 1 with attribute
[Export(typeof(IService1))]
public class Service1 : IService1 { }

public class Service2 : IService2 { }

验证说明

修正后运行代码,IService2可以正常从容器中解析,和特性导出的IService1行为一致。

内容的提问来源于stack exchange,提问作者Felix Almesberger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:06:02