2

私は次の状況にあります:

クラスServiceCaller:

public class ServiceCaller{
    private Service service;
    public void initialize(List<String> params){
        //get the params from list and set to String objects
        service = new Service(param1,param2);
    }
}

クラスサービス:

public class Service{
    SomeClass classe;
    public Service(String param1,String param2){
        //call methods to do stuffs with params
        classe = new SomeClass();
    }
}

私のアプリケーションには、.propertiesを読み取り、ServiceCallerクラスを呼び出し、構築後にServiceCallerのパラメーターを初期化して入力するフレームワークがあります。Serviceクラスは、パラメーターを操作するだけで、SomeClassクラスをインスタンス化します。

私はこれらすべてをGoogleGuiceに渡そうとしていますが、私のクラスはそうだった:

クラスサービスの発信者:

public class ServiceCaller{
    private final Service service;

    @Inject
    public ServiceCaller(Service service){
        this.service = service;
    }
    public initialize(List<String> params){
        //set params to objects...
    }
}

およびクラスサービス:

public class Service{
    private final SomeClass classe;

    @Inject
    public Service(SomeClass classe, String param1,String param2){
        //call methods to do stuffs with params
        this.classe = classe;
    }
}

ここに私の疑問があります:どうすればこれを行うことができますか?

1-ServiceCallerでは、注入されたコンストラクターはinitMethodの前に呼び出されます。このように、彼はまだParamsを持っていません。これにより、ServiceクラスにnullPointerが生成されると思います。文字列パラメータを受け取るにはどうすればよいですか?

2-ServiceCallerクラス内にサービスクラスを注入するにはどうすればよいですか?彼はinitを呼び出し、パラメーターを使用してServiceクラスをマウントし、この瞬間にのみService(パラメーターを既に使用)をServiceCallerに注入する必要があります。

4

1 に答える 1

1

構成するのは本当にServiceCallerの仕事Serviceですか?もしそうなら、このケースは依存性注入にはあまり適していません。今と同じように作成Servicenewます。

しかし、を作成するのは実際にはServiceCallerの仕事ではない可能性がありますService。むしろ、パラメータをに直接注入しServiceて構成してから、構成済みをに注入する必要ServiceがありServiceCallerます。

さて、問題がパラメータがから来ているServiceCallerが、SomeClass注入する必要があるということである場合、 ServiceCallerGuiceもGuiceも自分で仕事をすることはできません。構造を分割することをお勧めします。を注入してからにServiceFactory注入できるaを作成し、パラメーターを受け取るファクトリメソッドを提供します。何かのようなもの:SomeClassServiceCaller

ServiceCaller {
    private final ServiceFactory serviceFactory;
    private Service service;

    @Inject
    public ServiceCaller(ServiceFactory serviceFactory) {
        this.serviceFactory = serviceFactory;
    }

    public void initialize(List<String> params) {
        service = serviceFactory.create(params.get(0), params.get(1));
    }
}

class Service {
    private final SomeClass classe;

    public Service(SomeClass classe, String param1, String param2) {
        //call methods to do stuffs with params
        this.classe = classe;
    }
}

class ServiceFactory {
    private final SomeClass classe;

    @Inject
    public ServiceFactory(SomeClass classe) {
        this.classe = classe;
    }

    public Service create(String param1, String param2) {
        return new Service(classe, param1, param2);
    }
}
于 2012-07-20T13:14:46.153 に答える