这个问题适用于对Swinject for Swift有很多经验的人。
我将展示有问题的代码,我的问题在底部。
代码很多,抱歉。
这是MySwinjectStoryboard.swift
注册:
import Swinject
extension SwinjectStoryboard
{
class func setup ()
{
defaultContainer.register( Stopwatch.self )
{
responder in Stopwatch(
signals: responder.resolve( SignalsService.self )!
)
}
defaultContainer.register( SignalsService.self )
{
_ in SignalsService()
}.inObjectScope( .Container )
defaultContainer.register( ImageService.self )
{
responder in ImageService(
signals: responder.resolve( SignalsService.self )!
, stopwatch: responder.resolve( Stopwatch.self )!
)
}.inObjectScope( .Container )
defaultContainer.registerForStoryboard( StartUpViewController.self )
{
resolvable, viewController in
viewController.stopwatch = resolvable.resolve( Stopwatch.self )!
viewController.image = resolvable.resolve( ImageService.self )!
}
}
}
这是Stopwatch.swift
,它只是在触发 onComplete 处理程序之前暂停一段时间:
import Foundation
class Stopwatch: StopwatchProtocol
{
var key: String { return "Stopwatch_\( _key ).Complete" }
private var
_signals: SignalsProtocol
, _key: UInt16
, _timer: NSTimer?
, _data: AnyObject?
func startWith (
Delay delay: Double
, ForListener closure: ( String, Any? ) -> Void
){
_data = nil
_startWith( Delay: delay, ForListener: closure )
}
func stop ()
{
guard let timer = _timer else { return }
timer.invalidate()
_timer = nil
_data = nil
}
private func _startWith (
Delay delay: Double
, ForListener closure: ( String, Any? ) -> Void
){
stop()
_timer = NSTimer.scheduledTimerWithTimeInterval(
NSTimeInterval( delay )
, target: self
, selector: #selector( _onTimerComplete )
, userInfo: nil
, repeats: false
)
}
@objc private func _onTimerComplete ()
{
stop()
print( "stopwatch with key `\( key )` complete." )
}
required init ( signals: SignalsProtocol )
{
_signals = signals
_key = getPrimaryKey()
print( "primary key: \( _key )" )
}
}
ImageService.swift
目前通过init
函数简单地接受信号和秒表属性:
protocol ImageProtocol {}
class ImageService: ImageProtocol
{
private let
_signals: SignalsProtocol
, _stopwatch: StopwatchProtocol
required init (
signals: SignalsProtocol
, stopwatch: StopwatchProtocol
){
_signals = signals
_stopwatch = stopwatch
lo( "ImageService key: \( _stopwatch.key )" )
}
}
SignalsService.swift
当前是一个空模型类:
protocol SignalsProtocol {}
class SignalsService: SignalsProtocol {}
虽然StartUpViewController.swift
是一个基本UIViewController
的,目前只接受其注入的属性:
import UIKit
class StartUpViewController: UIViewController
{
var image: ImageService? {
willSet {
guard _image == nil else { return }
_image = newValue
}
}
var signals: SignalsService? {
willSet {
guard _signals == nil else { return }
_signals = newValue
}
}
var stopwatch: StopwatchProtocol? {
willSet {
guard _stopwatch == nil else { return }
_stopwatch = newValue
print( "StartUpViewController key: \( _stopwatch.key )" )
}
}
internal var
_image: ImageService!
, _signals: SignalsService!
, _stopwatch: Stopwatch!
}
finallygetPrivateKey()
只是一个全局静态,返回唯一的 Ints:
private var _primaryKey = UInt16( 0 )
func getPrimaryKey () -> UInt16
{
_primaryKey += 1
return _primaryKey
}
现在据我了解,我注册Stopwatch.swift
的MySwinjectStoryboard.swift
方式意味着每次注入一个实例时,它将是一个新的离散实例。但是,两者ImageService.swift
都StartUpViewController.swift
被注入了相同的实例:
StartUpViewController key: Stopwatch_2.Complete
ImageService key: Stopwatch_2.Complete
ImageService
的关键应该是:
ImageService key: Stopwatch_3.Complete
请问有人知道为什么会这样吗?谢谢你。