私はJavaのバックグラウンドと新しい機能的なパラダイムから来ていますので、私はOOPのようなにおいがします。Scala - コンパニオンオブジェクトへの依存性注入
すべてがOKですここティル私はPaymentHandler
trait PaymentHandler {
def handleInit(paymentInfo: PaymentInfo, paymentConfig: PaymentConfig): Either[Future[WSResponse], Exception]
def handleComplete(paymentinfo: PaymentInfo, paymentConfig: PaymentConfig, clientToken: String): Future[Map[String, String]]
}
と
@Singleton
class PayPal extends PaymentHandler{....}
@Singleton
class BrainTree extends PaymentHandler{....}
形質名前を持っています。支払い方法に基づいて複数のPaymentGatewaysを設定したい場合に問題が発生します。 は当初、私は
class PaymentHandlerFactory @Inject()(
paypal:PayPal,
braintree:BrainTree) {
def get(name:String): PaymentHandler = {
name match {
case "paypal" => paypal
case "bt" => braintree
case _ => null
}
}
}
ようPaymentHandlerFactoryを書いた後、Guiceので注入されたPayPalのオブジェクトを取得するには、このPaymentHandlerFactoryを使用しています。しかし、どういうわけか私はこれが正しいやり方ではないと感じ、私はコンパニオンオブジェクトに乗りました。これは私が書いたコードです
object PaymentHandler {
@Inject
val paypal:PayPal = null
def apply(name:String): PaymentHandler = {
name match {
case "paypal" => paypal
case _ => null
}
}
}
これはPayPalオブジェクトを挿入できないので失敗します。今私は心に二つの質問があります。
- なぜスカラのコンパニオンオブジェクトに挿入できないのですか?
- スカラのような工場を実装する正しい方法は何ですか?
PaymentGatewayとは何ですか? – marstran
私の場合、PaymentGatewaysはPayPalとBrainTreeです。基本的には、支払いを行うために複数の第三者との通信を処理できるコードを記述したいと考えています。私はより明確になるように私の質問を更新しました。 –
'@ Named'注射を使わないのはなぜですか? [こちら](https://github.com/google/guice/wiki/BindingAnnotations#named)をご覧ください。あなたはあなたが望むものを正確に得るでしょう。 :)また、この素晴らしい記事を参照してください:https://pavelfatin.com/design-patterns-in-scala/ –