EnesKaraosman / MonoRepoPoC

This repository represents basic monorepository setup

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Mono Repository PoC

This repository aims to represent basic mono repository implementation

Local packages exist under /Packages path. We can add more..

Dependency injection related jobs exist in DI package. It has several protocols

Check Swinjector package for more detail about dependency injection. (Swinjector is created by me to demonstrate this PoC)

public protocol Injector {
    func registerFactory<T>(_ serviceType: T.Type, factory: @escaping () -> T)
    func registerSingleton<T>(_ serviceType: T.Type, instance: T)
    func registerLazySingleton<T>(_ serviceType: T.Type, factory: @escaping () -> T)

    func resolve<T>(_ serviceType: T.Type) -> T?
    func unregister<T>(_ serviceType: T.Type)
    func isRegistered<T>(_ serviceType: T.Type) -> Bool
    func reset()
}

public protocol ModuleInjection {
    func registerDependencies(injector: Injector)
}

public protocol FeatureResolver {
    var moduleInjection: ModuleInjection? { get }
}

Every package that we want it's dependencies to be registered to app, can implement FeatureResolver protocol. Check @main file to see how we register (dependency injection can be handled in a central place, dedicated class)

let getIt = DependencyInjector.shared
let injectionModules: [FeatureResolver] = [LoggerPackageResolver()]

for module in injectionModules {
    module.moduleInjection?.registerDependencies(injector: getIt)
}

This way;

  • Any Package's dependencies can be registered into app.
  • App's dependencies can be used in any package (if package has access to registered protocol/class)
  • A package can use other package and it's dependencies (if package has access to registered protocol/class)

To demonstrate PoC, we've created MonoRepoLogger package. For more details see the implementation..

About

This repository represents basic monorepository setup


Languages

Language:Swift 100.0%