【问题标题】:MEF Exporting using RegistrationBuilder does not work使用 RegistrationBuilder 导出 MEF 不起作用
【发布时间】:2021-11-04 08:03:34
【问题描述】:

我正在尝试使用 [Export] 属性和注册生成器填充 MEF 目录。 但是使用属性导出的服务可以解析,使用RegistrationBuilder注册的服务无法解析。 看看我下面的代码:

static class Program
{
  [STAThread]
  static void Main()
  {
    // export service 2 using registration builder
    var builder = new RegistrationBuilder();
    builder.ForType<IService2>().Export<Service2>();

    var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), builder);
    var container = new CompositionContainer(catalog, CompositionOptions.DisableSilentRejection);
    container.SatisfyImportsOnce(builder);

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

    // throws 
    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 { }

我做错了什么?有人可以帮助我吗?谢谢!

【问题讨论】:

    标签: c# mef


    【解决方案1】:

    试试

    builder.ForType<Service2>().Export<IService2>();
    

    不是

    builder.ForType<IService2>().Export<Service2>();
    

    【讨论】:

    • 我想注册一个抽象的实现,这应该如何与您提供的解决方案一起使用?您不能导出接口。
    • 当您调用 .Export 时,它等效于 [Export(IService2)]。在构建器中,您应该指定要影响导出(选择器)的类型。所以 .ForType 表示只有 Service2 会受到影响;如果您调用 .ForTypesDerivedFrom - 所有实现 IService2 的类型都会受到影响。
    • 谢谢!你说的对。我做错了。导出实现的接口。
    猜你喜欢
    • 2017-10-05
    • 2011-02-09
    • 2011-03-02
    • 1970-01-01
    • 2017-10-07
    • 2018-01-29
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多