【发布时间】:2021-08-22 21:05:53
【问题描述】:
有没有办法在水晶中进行依赖注入,我只在一些框架(如 athena 和 shivneri)中找到了它,而不是单独找到它
【问题讨论】:
标签: dependency-injection crystal-lang
有没有办法在水晶中进行依赖注入,我只在一些框架(如 athena 和 shivneri)中找到了它,而不是单独找到它
【问题讨论】:
标签: dependency-injection crystal-lang
Dependency injection 是一种通用技术,它在 Crystal 中得到支持,例如,通过构造函数注入。下面的例子几乎可以用任何面向对象的语言来编写。它定义了一个接口(一个抽象类),并将其传递给构造函数。稍后,您可以选择要提供的实现:
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。但也许您问的不是manually arranging the services,而是如何使用dependency injection framework 进行接线?
据我所知,Crystal 不存在流行的依赖注入框架。应该可以写一个,但我不清楚是否需要。请注意,依赖框架在某些语言(如 Java)中得到广泛使用,但并非全部使用。 Ruby 是存在依赖框架但 remain controversial 的一个示例。
【讨论】: