Flutterando / auto_injector

Dependency injection system. But without build_runner :)
https://pub.dev/packages/auto_injector
Other
54 stars 15 forks source link

Enable get instance by tag #8

Closed toshiossada closed 1 year ago

toshiossada commented 1 year ago

Once it's possible add Bind with tag should be abble to get intance by tag name too

jacobaraujo7 commented 1 year ago

Terá uma modificação no sistema de módulos que impactará nessa modificação. Vamos aguardar https://github.com/Flutterando/auto_injector/pull/5

toshiossada commented 1 year ago

Terá uma modificação no sistema de módulos que impactará nessa modificação. Vamos aguardar #5

Vamos ver, fiz a alteraçao a pedido de alguem da comunidade ontem

davidsdearaujo commented 1 year ago

@toshiossada now we use the layers structure to get all the binds. I've removed tag from Binds because it was only used as a workaround to identify the Injector the bind came from.

Could you explain how it would be used?

toshiossada commented 1 year ago

seria para funcionar que nem o GetIt, aqui por exemplo temos casos que criamos binds do mesmo tipo e recuperamos por tagName, fazemos isso para utilizarmos em um sistema Server Driven UI, o @jacobaraujo7 explicou que irão utilizar a palavra 'tag' para outra coisa, entao podemos escolher outra nomenclatura como 'instanceName' ou como desejarem

marcuspmd commented 1 year ago

@davidsdearaujo um dos casos que eu tive foi, que tenho uma interface de envio de twoFactorAuthentication e pode ser enviado tanto por sms ou email, então tanto o caso de uso do twoFactorSmsImpl e twoFactorEmailImpl implementa a interface twoFactorAuthentication.

Então eu instanciava as duas classes no modular 5 e na hora que injectar, eu colocar Modular.get < twoFactorSmsImpl > () e Modular.get < twoFactorEmailImpl > () e dentro da view, de acordo aonde clicava enviar ou o usecase 1 ou o usecase 2, com a atualização que teve isso já não e mais possivel tendo que inserir mais uma camada de interface.

Então para realizar isso agora tenho que ter a twoFactorSms implements twoFactorAuthentication, e depois ter a twoFactorSmsImpl implements twoFactorSms, e do mesmo modo do email tambem, isso aumentando uma interface adicionar pra depois eu poder receber qualquer uma das duas no usecase principal.

towFactorSelect

davidsdearaujo commented 1 year ago

scorpionslh

@davidsdearaujo um dos casos que eu tive foi, que tenho uma interface de envio de twoFactorAuthentication e pode ser enviado tanto por sms ou email, então tanto o caso de uso do twoFactorSmsImpl e twoFactorEmailImpl implementa a interface twoFactorAuthentication.

Então eu instanciava as duas classes no modular 5 e na hora que injectar, eu colocar Modular.get < twoFactorSmsImpl > () e Modular.get < twoFactorEmailImpl > () e dentro da view, de acordo aonde clicava enviar ou o usecase 1 ou o usecase 2, com a atualização que teve isso já não e mais possivel tendo que inserir mais uma camada de interface.

Então para realizar isso agora tenho que ter a twoFactorSms implements twoFactorAuthentication, e depois ter a twoFactorSmsImpl implements twoFactorSms, e do mesmo modo do email tambem, isso aumentando uma interface adicionar pra depois eu poder receber qualquer uma das duas no usecase principal.

Nesse caso você está referenciando diretamente as implementações, então deveria utilizar a própria classe implementação para injetar a dependência.

Não é porque está utilizando interfaces que sua estrutura está preparada para substituição de Liskov.

marcuspmd commented 1 year ago

Na verdade é pq ali estou utilizando strategy, pra mudar em runtime o usecase, o @jacobaraujo7 ate falou sobre instanciar isso na classe, pq o normal não e injetar nesse caso, mas na versão anterior funcionava passando a propria implementação, na versao 6 nao consigo da um modular.get na instancia, mas resolvi de outro modo.

davidsdearaujo commented 1 year ago

Fiz um PR implementando esse sistema de tags novamente, mas agora ele é chamado de "key".

jacobaraujo7 commented 1 year ago

13