我正在编写一个简单的ASP.NET Core webapi。我的appsetting.json
具有以下简单配置:
"Providers": [
{
"Class": "Namespace1.Provider1",
"Assembly": "Namespace1",
},
{
"Class": "Namespace1.Provider2",
"Assembly": "Namespace1",
},
]
我想配置DI,以便根据某种字符串类型,它应该采用Provider1或Provider2并相应地实现功能。
基本上想知道在同一接口的多个实现中使用DI的最佳方法。
答案 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
}
如果愿意,您可以将选择逻辑移至应用程序设置,例如某些类型映射。