2017-07-11 14 views
2

に基づいて、私は「Session.class」を次ています条件付き@Autowired私は春に新たなんだと私はいくつかのコードをリファクタリングしようとしているコンストラクタの引数

public class Session { 
    ... 
    private Wallet currenetWallet; 
    ... 
    public Session(..., int sessionId, ...) { 
     ... 

     ThirdPartyToken token = context.getBean(ThirdPartyTokenDAO.class).getThirdPartyToken(sessionId); 

     if (token.getExternalUser().getMerchant().getType().equals("SOAPMerchant")) { 
      currenetWallet = (Wallet) context.getBean("SOAPExternalWallet", token); 
     } 
     else if (token.getExternalUser().getMerchant().getType().equals("JSONMerchant")) { 
      currenetWallet = (Wallet) context.getBean("JSONExternalWallet", token); 
     } 
     else { 
      currenetWallet = (Wallet) context.getBean("GuestWallet", 1000.0); 
     } 

     ... 
    } 
} 

私はcontext.getBeanを使用していることを読みます()は悪い習慣であり、クラスをuntestableにします。 上記の方法でcurrentWalletを配線する正しい方法は何でしょうか?

+0

3つの値を入力し、店舗タイプに基づいてどちらを使用するかを選択します –

+0

今日は3つですが、明日は12種類がありますが、それらをすべてワイヤリングするのは無駄でしょうか? 私はこの解決策が気に入っていますが、実装するのが最も簡単です –

+0

あなたは実際に 'sessionId'ではなく' Wallet'クラスに依存していますので、これはコンストラクタで配線していなければなりません。システムがどのくらい定義されているかに応じて、 'Wallet'プロトタイプBeanを作成することができます。このBeanの作成は' Token'に依存し、そのセッションIDに依存します。 –

答えて

0

インターフェイスWalletを作成し、SOAPExternalWallet,JSONExternalWallet,GuestWalletなどの実装クラスを作成します。
ファクトリクラスを作成し、そのタイプに基づいて、ファクトリクラスから正しい実装を返します。

+0

しかし、私は春を使用していません、私はcurrentWalletフィールドを何とか@autowiredにしたいと思います... –

+1

ここに私の答えを見てくださいhttps://stackoverflow.com/questions/44000672/spring-how-to-change-実行時のインタフェース実装/ 44001051#44001051 – pvpkiran

関連する問題