Uma estrutura ultraleve de injeção de dependência/localizador de serviço para Swift 5.x no iOS.
Nota: O Resolver agora está oficialmente obsoleto e substituído pelo meu novo sistema de injeção de dependência, Factory. Factory é um verdadeiro sistema de injeção de dependência baseado em contêiner que é seguro em tempo de compilação e é menor, mais leve e mais rápido que o Resolver. Por melhor que seja o Resolver, o Factory é melhor.
As estruturas de injeção de dependência oferecem suporte ao padrão de design Inversão de controle. Deixando de lado as definições técnicas, a injeção de dependência se resume basicamente a:
| Dar a um objeto as coisas de que ele precisa para realizar seu trabalho.
É isso. A injeção de dependência nos permite escrever código fracamente acoplado e, como tal, mais fácil de reutilizar, simular e testar.
Para obter mais informações, consulte: Uma introdução suave à injeção de dependência.
Existem seis estratégias clássicas de injeção de dependência:
O Resolver oferece suporte a todos eles. Siga os links para obter uma breve descrição, exemplos e os prós e contras de cada um.
Falando em anotações, o Resolver agora oferece suporte à resolução de serviços usando a nova sintaxe de wrapper de propriedade no Swift 5.1.
class BasicInjectedViewController : UIViewController {
@ Injected var service : XYZService
@ LazyInjected var service2 : XYZLazyService
@ WeakLazyInjected var service3 : XYZAnotherLazyService ?
}
Basta adicionar a palavra-chave Injected e suas dependências serão resolvidas automaticamente. Consulte a documentação de Anotação para saber mais sobre esta e outras estratégias.
Há também um wrapper @InjectedObject
que pode injetar objetos observáveis em visualizações SwiftUI.
O Resolver é implementado em pouco mais de 700 linhas de código real em um único arquivo, mas inclui muitos recursos nessas 700 linhas.
TLDR: No mínimo, certifique-se de ler sobre Inferência automática de tipo, escopos e opcionais.
Usar o Resolver é um processo simples de três etapas:
Conforme mencionado, o Resolver é um sistema ultraleve de injeção de dependência, implementado em pouco mais de 700 linhas de código e contido em um único arquivo.
O Resolver também foi projetado para desempenho. SwinjectStoryboard, por exemplo, é um ótimo sistema de injeção de dependência, mas o Resolver é cerca de 800% mais rápido na resolução de cadeias de dependência do que o Swinject.
E, ao contrário de alguns outros sistemas, o Resolver é escrito 100% em Swift 5, sem código Objective-C, mistura de métodos ou dependências internas no tempo de execução do Objective-C.
Além disso, resolvedor:
Finalmente, com a Inferência Automática de Tipo você também tende a escrever cerca de 40-60% menos código de injeção de dependência usando o Resolver.
O Resolver oferece suporte ao CocoaPods e ao Swift Package Manager.
pod " Resolver "
O Resolver em si é apenas um único arquivo de origem (Resolver.swift), então também é fácil simplesmente baixar o arquivo e adicioná-lo ao seu projeto.
Observe que a versão atual do Resolver (1.4) oferece suporte ao Swift 5.3 e que a versão mínima do iOS atualmente compatível com esta versão é o iOS 11.
Leia o guia de instalação para obter informações sobre suporte a versões anteriores.
Tornei meu repositório do Builder público. É um aplicativo iOS simples de estilo mestre/detalhado que contém exemplos de...
Eu também o uso para brincar com algum novo código que usa padrões de construtor no estilo SwiftUI para construir a construção da interface do usuário e para construir solicitações de rede. Confira.
É possível que atualizações recentes do Resolver possam causar alterações significativas em sua base de código.
O Resolver 1.4 melhorou a segurança e o desempenho do thread. Nenhuma alteração significativa, embora o acesso direto aos escopos do Resolver esteja obsoleto. Consulte: Escopos.
O Resolver 1.3 adiciona espaços de nomes ao Resolver. O registro de nomes permite um melhor preenchimento automático e torna seu código mais seguro, reduzindo possíveis erros de avaliação de tempo de execução. Esta é uma possível alteração significativa. Consulte: Instâncias nomeadas
O Resolver 1.2 alterou a forma como os argumentos são passados para a fábrica de registro para fornecer melhor suporte para passagem e tratamento de argumentos únicos e múltiplos. Esta é uma mudança radical. Consulte: Passando e tratando vários argumentos
O Resolver 1.5 atualizou vários mecanismos de registro e cache usados no Resolver. Este provavelmente não é um problema, a menos que você tenha escrito algo que dependa do comportamento interno do Resolver.
Se você quiser apoiar meu trabalho no Factory e no Resolver, considere um patrocínio do GitHub! Existem muitos níveis para maior apoio e até mesmo para orientação e treinamento empresarial.
Ou você pode simplesmente me comprar uma xícara de café!
O Resolver foi projetado, implementado, documentado e mantido por Michael Long, engenheiro líder de software iOS e um dos 1.000 principais escritores de tecnologia no meio.
Michael também foi um dos vencedores do Open Source Peer Reward do Google em 2021 por seu trabalho no Resolver.
O Resolver está disponível sob a licença do MIT. Consulte o arquivo LICENSE para obter mais informações.