O Beagle Múltiplas Configurações é uma maneira de inicializar uma instância do Beagle para o fluxo server driven corrente usando uma configuração única. Desta forma você pode manter várias instâncias (configurações) na sua aplicação.
Você verá abaixo como configurar sua aplicação para usar esta funcionalidade.
Para definir uma nova configuração você precisa ciar um objeto BeagleDependenciesFactory
e customizar as dependências que desejar.
Neste passo você pode configurar todas as dependências também suportadas pelo BeagleDependencies
As propriedades no BeagleDependenciesFactory
recebem uma Factory
do tipo necessário:
public struct Factory<T> {
var create: (DependenciesContainerResolving) -> T
public init(_ createBlock: @escaping (DependenciesContainerResolving) -> T) {
self.create = createBlock
}
}
Esta factory tem uma closure create
que será usada na configuração das dependências. Esta closure recebe o DependenciesContainerResolving
para resolução de dependências internas.
Como um exemplo podemos ver abaixo como configurar o networkClient, analyticsProvider e logger:
var dependencies = BeagleDependenciesFactory()
dependencies.networkClient = Factory { resolver in
NetworkClientDefault(resolver)
}
dependencies.theme = Factory { _ in
AppTheme.theme
}
dependencies.urlBuilder = Factory { _ in
UrlBuilder(baseUrl: URL(string: .baseURL))
}
dependencies.analyticsProvider = Factory { _ in
AnalyticsProviderDemo()
}
dependencies.logger = Factory { _ in
BeagleLoggerDefault()
}
NetworkClientDefault
recebe um resolver no init. Isso é necessário em todas as dependências que possuem dependências internas e usam @Injected
ou @OptionalInjected
.Para a implementação do NetworkClientDefault temos:
public class NetworkClientDefault: NetworkClientProtocol {
@OptionalInjected var logger: LoggerProtocol?
init(_ resolver: DependenciesContainerResolving) {
_logger = OptionalInjected(resolver)
}
// sua implementação aqui
}
Para acessar as novas dependências criadas você poderá instanciar um BeagleConfiguration
e acessar suas dependências por meio da propriedade dependencies
:
public protocol BeagleEnviromentProtocol {
var coder: CoderProtocol { get }
var navigator: NavigationProtocol { get }
var operationsProvider: OperationsProviderProtocol { get }
var logger: LoggerProtocol { get }
var globalContext: GlobalContextProtocol { get }
}
Você poderá registrar novos componentes, operações, ações, navigationController:
let configuration = BeagleConfiguration(dependencies: dependencies)
// custom components and actions
configuration.dependencies.coder.register(type: CustomText.self, named: "custom-text")
configuration.dependencies.coder.register(type: CustomAction.self, named: "custom-action")
// custom operation
configuration.dependencies.operationsProvider.register(operationId: "sum", handler: sumHandler)
// custom navigation
configuration.dependencies.navigator.registerNavigationController(builder: CustomBeagleNavigationController.init, forId: "CustomBeagleNavigation")
Para configurar um novo ponto de estrada usando uma configuração específica você poderá passar a configuração via inicializador:
BeagleScreenViewController(_:controllerId:config:)
BeagleView(_:config:beagleViewStateObserver:)
Exemplo de uma configuração completa:
// in you AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
// Defining a configuration
var dependencies = BeagleDependenciesFactory()
dependencies.networkClient = Factory { resolver in
NetworkClientDefault(resolver)
}
dependencies.logger = Factory { _ in
BeagleLoggerDefault()
}
// Acessing dependencies
let configuration = BeagleConfiguration(dependencies: dependencies)
configuration.dependencies.coder.register(type: CustomText.self, named: "custom-text")
// Configuring a beagle entry point
window?.rootViewController = BeagleScreenViewController(ScreenType.Remote(url: "endpoint"), config: configuration)
window?.makeKeyAndVisible()
// you can define other configurations and instantiate other BeagleSreenViewController
return true
}
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.