如何使用从appsettings.json中读取的同一类的多个实现来有条件地解决问题

时间:2018-11-09 10:20:18

标签: c# dependency-injection

我正在编写一个简单的ASP.NET Core webapi。我的appsetting.json具有以下简单配置:

  "Providers": [
    {
      "Class": "Namespace1.Provider1",
      "Assembly": "Namespace1",
    },
    {
      "Class": "Namespace1.Provider2",
      "Assembly": "Namespace1",
    },  
  ]

我想配置DI,以便根据某种字符串类型,它应该采用Provider1或Provider2并相应地实现功能。

基本上想知道在同一接口的多个实现中使用DI的最佳方法。

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是使用命名注册,但是不幸的是,ASP.NET Core中的内置DI框架不支持命名注册。因此,如果注册多个实现,则无法告知框架在哪种情况下应选择哪个框架。

但是,有一些第三方DI集成可以使用这种功能,您可以here进行检查。

如果您不想使用它们中的任何一个,那么最好的选择是使用工厂注册,这可以让您选择应该解决的服务内容,例如:

private func buildBookNode(at position: SCNVector3, rotation: Measurement<UnitAngle> = Measurement(value: 0, unit: .radians)) -> SCNNode {
    let book = SCNBox(width: 0.4, height: 0.1, length: 0.3, chamferRadius: 0)
    let bookNode = SCNNode(geometry: book)
    bookNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
    bookNode.physicsBody?.isAffectedByGravity = true
    bookNode.physicsBody?.friction = 2.0
    bookNode.physicsBody?.mass = 0.3
    bookNode.physicsBody?.restitution = 0.0
    bookNode.position = position
    bookNode.rotation = SCNVector4(0.0, 1.0, 0.0, rotation.converted(to: .radians).value)
    return bookNode
}

如果愿意,您可以将选择逻辑移至应用程序设置,例如某些类型映射。