2016-12-09 15 views
1

私は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オブジェクトを挿入できないので失敗します。今私は心に二つの質問があります。

  1. なぜスカラのコンパニオンオブジェクトに挿入できないのですか?
  2. スカラのような工場を実装する正しい方法は何ですか?
+0

PaymentGatewayとは何ですか? – marstran

+0

私の場合、PaymentGatewaysはPayPalとBrainTreeです。基本的には、支払いを行うために複数の第三者との通信を処理できるコードを記述したいと考えています。私はより明確になるように私の質問を更新しました。 –

+0

'@ Named'注射を使わないのはなぜですか? [こちら](https://github.com/google/guice/wiki/BindingAnnotations#named)をご覧ください。あなたはあなたが望むものを正確に得るでしょう。 :)また、この素晴らしい記事を参照してください:https://pavelfatin.com/design-patterns-in-scala/ –

答えて

1
  1. 彼らはオブジェクトではなくクラスですので、あなたがコンパニオンオブジェクトに注入することができない理由があります。つまり、インスタンスは1つしか存在せず、スカラ自体によって作成されます。依存性注入を行いたい場合は、依存性を必要とするものを依存性注入フレームワークで作成する必要があります。したがって、guiceを使いたい場合は、クラスを使用して託児所をモデル化する必要があります。

  2. あなたのclass PaymentHandlerFactoryで行ったことは実用的な方法であり、たいていの場合はおそらく動作すると思います。私は早過ぎてこれをあまりにも一般的にしないでください。

guice-yをもう少し増やしたい場合は、AssistedInjectを使用できます。

+0

詳細な答えをありがとう! –