crystal 语言的依赖注入

Depedency injection in crystal language

有什么方法可以在 crystal 中进行依赖注入,我只在一些框架(如 athena 和 shivneri)中找到它,但它本身没有

Dependency injection 是一种通用技术,它在 Crystal 中得到支持,例如,通过构造函数注入。下面的示例几乎可以用任何面向对象的语言编写成类似的。它定义了一个接口(一个抽象class),并将它传递给构造函数。稍后,您可以选择要提供的实现:

record Email, subject : String, to : String

abstract class EmailSender
  abstract def send(email)
end

class RealEmailSender < EmailSender
  def send(email)
    # some code to send an email
    # ...
  end
end

class StubEmailSender < EmailSender
  def send(email)
    # some test code to log the email without sending
    puts "STUB: sending email #{email}"
  end
end

class CheckoutService
  def initialize(@email_sender : EmailSender)
  end
  
  def process_order
    email = Email.new(subject: "Received order", to: "john.doe@abc.test")
    @email_sender.send(email)
  end
end

# inject the stub to skip sending a real email
email_service = StubEmailSender.new
checkout_service = CheckoutService.new(email_service)
checkout_service.process_order

构造函数注入证明依赖注入是可能的。另一种选择是使用 generics. But perhaps you were not asking about manually arranging the services, but on how to use a dependency injection framework 进行接线?

据我所知,Crystal 不存在流行的依赖注入框架。应该可以写一个,但是不清楚有没有必要。请注意,依赖框架在某些语言(如 Java)中得到广泛使用,但并非在所有语言中都有广泛使用。 Ruby 是一个存在依赖框架但 remain controversial.

的示例