2016-11-03 2 views
-2

Ich bin neu in der iOS-Entwicklung. Ich muss meine UIViewController injizierten Abhängigkeiten und Dienste injizieren, anstatt sie innerhalb init() oder viewDidLoad() Methoden zu erstellen. Etwas zu sehen wie folgt aus:mit Abhängigkeit Injection in iOS-Entwicklung und schnelle Programmiersprache

// Initialize View Controller 
let viewController = ViewController() 

// Configure View Controller 
viewController.requestManager = RequestManager() 

Meine Fragen sind:

  1. Ist das möglich in iOS oder nicht?
  2. Wo erstelle ich die Abhängigkeiten und UIViewControllers ??
  3. Wie sieht MyUIViewController aus, sollte ich init() Methode verwenden?

Hinweis 1: Ich verwende keine Container. Ich muss Pure Man DI benutzen.

Hinweis 2: Was ich meine, sieht wie IControllerFactory in ASP.NET MVC.

+1

Ich habe keine Ahnung, was Sie mit "Dependency Injection" bedeuten. Aber der Code, den du gezeigt hast, ist legal, also was ist das Problem? – matt

+0

wo füge ich es ein? –

+0

Wohin Sie wollen. Ihr Code erstellt einen View-Controller, so dass Sie dies beim Erstellen des View-Controllers tun würden. – matt

Antwort

2

Um Abhängigkeiten in einen View-Controller einfügen zu können, müssen Sie eine Unterklasse von UIViewController erstellen und eine benutzerdefinierte Init-Funktion erstellen.

Sehen Sie diese SO als Beispiel schreiben: how-do-i-make-a-custom-initializer-for-a-uiviewcontroller

Also in Ihrem UIViewController Unterklasse Sie eine benutzerdefinierte init haben würde, so etwas wie:

init(requestManager: RequestManager) 
{ 
    self.requestManager = requestManager 

    super.init(nibName: nil, bundle: nil) 
} 

und wo Sie eine Instanz von MyUIViewController schaffen würden Sie habe:

let myRequestManager = RequestManager() 
let viewController = MyUIViewController(requestManager: myRequestManager) 
3

Wenn Sie UIStoryboardSegue verwenden, um einen neuen view-Controller zu überführen, Sie können Setup, einschließlich der Abhängigkeitsinjektion, im -prepareForSegue: Callback durchführen. Dies geschieht, nachdem der View-Controller aus dem Storyboard geladen und initialisiert wurde, aber bevor eine Ansicht geladen wird. Beispiel:

- (void)prepareForSegue:(UIStoryboardSegue *)segue { 
    MyViewController * vc = (MyViewController *)segue.destinationViewController; 
    vc.injectedProperty1 = [InjectedObject new]; 
    vc.injectedProperty2 = [OtherInjectedObject new]; 
} 
2

Der Grund der BNR Buch nicht Fabrik Methoden erwähnen, ist, dass iOS-Apps nicht (in der Regel) verwenden sie View-Controller zu erstellen. Wenn Sie mit der iOS-Entwicklung noch nicht vertraut sind und diese Route weiterverfolgen, sollten Sie sich erneut Gedanken über Ihre App-Struktur machen.

Sie starten besser mit Storyboards und weisen Eigenschaften in der prepare(for segue: UIStoryboardSegue) Methode des präsentierenden View-Controllers zu. z.B.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let viewController = segue.destination as? MyViewController { 
     viewController.requestManager = requestManager 
    } 
} 

Obwohl, natürlich können Sie init?(coder aDecoder: NSCoder) erforderlich außer Kraft setzen ...

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    requestManager = RequestManager() 
} 
Verwandte Themen