J'ai essayé DI avec Ruby

Qu'est-ce que DI

Injection de dépendance

Éviter les dépendances en permettant aux objets d'être transmis à l'entrepreneur de l'extérieur

la mise en oeuvre

J'écrirai en utilisant Interactor comme exemple dry-container et dry-auto_inject J'ai essayé DI en utilisant

Version sans DI

not_di.rb



module Interactor
  class FindUser
    def initialize(params)
      @params = params
    end

    def call
      user_repo = UserRepository.new
      user_repo.by_pk(@params[:id])
    end
  end
end

Vous pouvez voir que cela dépend de UserRepository

version non utilisée du conteneur sec

pure-di.rb



module Interactor
  class FindUser
    def initialize(params: {}, user_repo: UserRepository.new)
      @params = params
      @user_repo = user_repo
    end

    def call
      @user_repo.by_pk(@params[:id])
    end
  end
end

Les arguments Initializd ont tendance à être énormes et difficiles à lire J'ai ceci

version conteneur sec

dry-di.rb


module Container
  module FindUser
    extend Dry::Container::Mixin

    #Enregistrer l'objet à injecter
    #Vous pouvez déclarer un objet par défaut avec block
    register "params"

    register "user_repo" do
      UserRepository.new
    end
  end
end


module Interactor
  class FindUser
    Import = Dry::AutoInject(Container::FindUser)
    #Vous pourrez appeler ce que vous incluez avec méthode
    include Import["params", "user_repo"]

    def call
      user_repo.by_pk(params[:id])
    end
  end
end

Le code a augmenté, mais les perspectives se sont améliorées en séparant les responsabilités.

Parce que l'Interactor dépend du Container et que l'appelant (tel que Controller) dépend également du Container. J'ai pu bien inverser la dépendance

before: controller -> interactor after: controller -> container <- interactor

Ce qui me rend heureux

--Le code est rafraîchissant

En externalisant l'initialisation vers le conteneur, la responsabilité de l'interacteur a été réduite. Je veux réduire les responsabilités par classe

Le test d'interacteurs peut être effectué sans préparer la base de données Dans l'exemple ci-dessus, vous pouvez passer un objet qui réagit à by_pk (id)

test.rb


User = Struct.new(:id, :name, :age)

class TestUserRepo
  def by_pk(id)
    User.new(id, "tarou", 20)
  end
end

params = { id: 1 }
user_repo = TestUserRepo.new
input = { params: params, user_repo: user_repo }

Interactor::FindUser.new(input).call

Peut être fait comme

Recommended Posts

J'ai essayé DI avec Ruby
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé BIND avec Docker
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé l'analyse morphologique avec MeCab
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
J'ai essayé GraphQL avec Spring Boot
J'ai essayé Flyway avec Spring Boot
J'ai essayé de personnaliser Slim avec Scaffold
J'ai essayé d'installer le plugin lié à Ruby on Rails avec vim-plug
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé un problème de calendrier avec Ruby
J'ai essayé d'utiliser Realm avec Swift UI
J'ai commencé Ruby
J'ai essayé de démarrer avec Web Assembly
J'ai essayé d'utiliser Scalar DL avec Docker
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
J'ai essayé Spring.
J'ai essayé l'apprentissage de la gestion qui fait gagner du temps avec Studyplus.
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai fait une mort risquée avec Ruby
J'ai essayé de mettre Tomcat
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé de réimplémenter Ruby's Float (arg, exception: true) avec builtin
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai essayé youtubeDataApi.
J'ai essayé de refactoriser ①
J'ai essayé FizzBuzz.
J'ai essayé JHipster 5.1
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai essayé d'implémenter Ruby avec Ruby (et C) (j'ai joué avec intégré)
J'ai aussi essayé Web Assembly avec Nim et C
[Notions de base sur Ruby] J'ai essayé d'apprendre des modules (Chapitre 1)
J'ai essayé Eclipse MicroProfile OpenAPI avec WildFly Swarm
J'ai essayé de casser le bloc avec java (1)
J'ai vérifié le nombre de taxis avec Ruby
J'ai fait un portfolio avec Ruby On Rails
J'ai essayé de démarrer avec Gradle sur Heroku
[J'ai essayé] Tutoriel de printemps
J'ai essayé d'exécuter Autoware
J'ai essayé d'utiliser Gson
J'ai essayé QUARKUS immédiatement
Premiers pas avec Ruby
J'ai essayé d'utiliser TestNG
J'ai essayé Spring Batch
J'ai essayé d'utiliser Galasa