Provident
is a view controller provider framework that uses inversion of control to simplify view controller creation.
UIStoryboard
to create the view controllerView
in a UIHostingController
If a view controller is reimplemented as a different "flavour" (e.g. refactored from a Storyboard to SwiftUI), all calling code must be changed accordingly. Essentially, some of the internals of the view controller are exposed, reducing encapsualtion.
Provident
uses the concept of a ViewControllerProvider
to solve this, moving all of the logic for view controller creation to a single place.
Assuming that your dependencies aren't static singletons, they'll need to be passed into the view controller during creation.
e.g. If we have a single RootViewController
and construct it with RootViewController(dep1: Dependency1)
, as soon as that view controller is responsible for creating a ChildViewController
with ChildViewController(dep2: Dependency2)
, we have to update all RootViewController
initialisaton calls to RootViewController(dep1: Dependency1, dep2: Dependency2)
.
As RootViewController
adds more child view controllers, and those child view controllers add their own child view controllers, the RootViewController
suddenly has to be initialised with all dependencies used in all view controllers in the system, leading to the creation of "god objects".
Provident
uses the concept of a Registry
to solve this, allowing view controllers to be created without any knowledge of their dependencies.
As we saw above, if we initialise ChildViewController(dep2: Dependency2)
from within RootViewController
, we tightly couple those implementations together, making it harder to switch out ChildViewController
for another UIViewController
instance.
The Provident
Registry
API works at the UIViewController
level, allowing view controllers to be switched out without any changes to the calling code.
link |
Stars: 0 |
Last commit: 21 weeks ago |
Changes in Registry
:
func createViewController(from token: T, context: C) -> ViewController?
to
func createViewController(token: T, context: C) throws -> ViewController
Adds a backward compat-like Registry
extension with:
func findViewController(token: T, context: C) -> ViewController?
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics