【问题标题】:Depedency injection in crystal language水晶语言中的依赖注入
【发布时间】:2021-08-22 21:05:53
【问题描述】:

有没有办法在水晶中进行依赖注入,我只在一些框架(如 athena 和 shivneri)中找到了它,而不是单独找到它

【问题讨论】:

    标签: dependency-injection crystal-lang


    【解决方案1】:

    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 的一个示例。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多