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.
的示例
有什么方法可以在 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.
的示例