Dependency injection 无法在Kephas的开放泛型服务中使用构造函数

Dependency injection 无法在Kephas的开放泛型服务中使用构造函数,dependency-injection,composition,kephas,Dependency Injection,Composition,Kephas,不知何故,我无法让一个带有构造函数的实现将服务导出为OpenGeneric。我尝试向其添加[CompositionConstructor]属性,但没有成功。它抛出类似于: System.Composition.Hosting.CompositionFailedException : No importing constructor was found on type 'MyType'. 有什么想法吗?不幸的是,这是System.Composition库中的一个错误(请检查此处)。正如我所看到的

不知何故,我无法让一个带有构造函数的实现将服务导出为OpenGeneric。我尝试向其添加[CompositionConstructor]属性,但没有成功。它抛出类似于:

System.Composition.Hosting.CompositionFailedException : No importing constructor was found on type 'MyType'.

有什么想法吗?

不幸的是,这是System.Composition库中的一个错误(请检查此处)。正如我所看到的,这个bug被添加到5.0里程碑中,意味着明年秋天。在我看来,您有以下选择:

  • 将实现类仅保留为默认构造函数。在这里,您可以使用AmbientServices.Instance.CompositionContainer.GetExport来获取所需的依赖项。我知道这不是最好的解决办法,但它应该会奏效。警告:如果服务被标记为作用域,那么如果您依赖于其他作用域服务,您将无法为它们获得正确的作用域

  • Kephas版本6.5.0为Kephas composition带来了一个Autofac实现,在该实现中,事情按其设想的方式工作。查看上的源代码以获取最新版本并生成所需的NuGet。我会尽快在nuget上发布测试版

  • 使用您选择的DI容器,为您使用的版本带来您自己的组合实现。您可以参考Autofac实现,尽管在最新版本中有一些突破性的更改。选择DI容器时,确保它支持开放泛型、元数据和支持IExportFactory接口的方法


  • 正如我所见,没有完美的解决方案。。。然而,由于在我的例子中依赖项是单例的,我想我会接受第一个建议。单元测试不是最好的,但在这种情况下是可以接受的。但是Autofac绝对值得一试,也许当Kephas的6.5版发布时。对于单元测试,只需添加一个具有所需依赖项的内部构造函数。现在,直到问题解决为止。与Autofac一样,它是成熟的,并且充满了优秀的特性,这也是ASP.NET核心团队的建议。