一般的にDIコンテナは複数インスタンスには使用しない?
https://github.com/Swinject/Swinject
一般的なDIコンテナの話がしたいのですが、何か具体的な例があったほうがよいと思い、上記のDIコンテナを例に書きます。
READMEにある通り、下記で I'm playing with Mimi.
と出力できます。
protocol Animal {
var name: String? { get }
}
class Cat: Animal {
let name: String?
init(name: String?) {
self.name = name
}
}
protocol Person {
func play()
}
class PetOwner: Person {
let pet: Animal
init(pet: Animal) {
self.pet = pet
}
func play() {
let name = pet.name ?? "someone"
print("I'm playing with \(name).")
}
}
let container = Container()
container.register(Animal.self) { _ in Cat(name: "Mimi") }
container.register(Person.self) { r in
PetOwner(pet: r.resolve(Animal.self)!)
}
let person = container.resolve(Person.self)!
person.play() // prints "I'm playing with Mimi."
上記は
let person = PetOwner(pet: Cat(name: "Mimi"))
person.play()
と同じことをやっているに過ぎません。(やはりあなた方のDependency Injectionはまちがっている。によるとこれで立派なDIパターン
となります。)
さて、では別のPetOwner
のインスタンスと別のCat
のインスタンスを紐付けるにはどうすればよいのでしょうか?
やりたいコード例としては下記です(下記をDIコンテナでやるにはどうするのか?)。
そもそも一般的なDIコンテナはこのような使用は想定されていないのでしょうか??
let owner1 = PetOwner(pet: Cat(name: "Mimi"))
let owner2 = PetOwner(pet: Cat(name: "Kiki"))
owner1.play()
owner2.play()