Ich habe DI mit Ruby versucht

Was ist DI?

Abhängigkeitsspritze

Vermeiden Sie Abhängigkeiten, indem Sie Objekte von außen an den Auftragnehmer weitergeben

Implementierung

Ich werde am Beispiel von Interactor schreiben Trockencontainer und dry-auto_inject Ich habe DI mit versucht

Version ohne 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

Sie können sehen, dass es von UserRepository abhängt

Trockenbehälter unbenutzte Version

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

Initialisierte Argumente sind in der Regel sehr umfangreich und schwer zu lesen ich habe das

Trockenbehälterversion

dry-di.rb


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

    #Registrieren Sie das zu injizierende Objekt
    #Sie können ein Standardobjekt mit block deklarieren
    register "params"

    register "user_repo" do
      UserRepository.new
    end
  end
end


module Interactor
  class FindUser
    Import = Dry::AutoInject(Container::FindUser)
    #Sie können aufrufen, was Sie mit method einschließen
    include Import["params", "user_repo"]

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

Der Kodex hat zugenommen, aber die Aussichten haben sich durch die Trennung der Verantwortlichkeiten verbessert.

Weil der Interactor vom Container abhängt und der Aufrufer (z. B. Controller) auch vom Container abhängt. Ich konnte die Abhängigkeit gut umkehren

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

Was mich glücklich macht

Durch das Auslagern der Initialisierung in den Container wurde die Verantwortung des Interaktors reduziert. Ich möchte die Verantwortlichkeiten pro Klasse reduzieren

Der Interaktortest kann ohne Vorbereitung der DB durchgeführt werden Im obigen Beispiel können Sie ein Objekt übergeben, das auf "by_pk (id)" reagiert

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

Kann wie gemacht werden

Recommended Posts

Ich habe DI mit Ruby versucht
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe eine morphologische Analyse mit MeCab versucht
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe GraphQL mit Spring Boot ausprobiert
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe versucht, Slim mit Scaffold anzupassen
Ich habe versucht, das Ruby on Rails-Plugin mit vim-plug zu installieren
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe ein Kalenderproblem mit Ruby versucht
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe Ruby gestartet
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe es mit Spring versucht.
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe versucht, Tomcat zu setzen
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe versucht, Ruby's Float (arg, Ausnahme: true) mit Builtin neu zu implementieren
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Ich habe FizzBuzz ausprobiert.
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe versucht, AdoptOpenJDK 11 (11.0.2) mit dem Docker-Image zu überprüfen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Ich habe versucht, Ruby mit Ruby (und C) zu implementieren (ich habe mit Builtin gespielt)
Ich habe auch Web Assembly mit Nim und C ausprobiert
[Ruby-Grundlagen] Ich habe versucht, Module zu lernen (Kapitel 1)
Ich habe Eclipse MicroProfile OpenAPI mit WildFly Swarm ausprobiert
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe die Anzahl der Taxis mit Ruby überprüft
Ich habe mit Ruby On Rails ein Portfolio erstellt
Ich habe versucht, mit Gradle auf Heroku zu beginnen
[Ich habe es versucht] Spring Tutorial
Ich habe versucht, Autoware auszuführen
Ich habe versucht, Gson zu benutzen
Ich habe sofort QUARKUS ausprobiert
Erste Schritte mit Ruby
Ich habe versucht, TestNG zu verwenden
Ich habe Spring Batch ausprobiert
Ich habe versucht, Galasa zu benutzen