2016-07-19 3 views
1

guice를 처음 사용합니다.Guice : 특정 조건에서 기본 구현으로 폴백

일부 데이터를 정의한 파일 (json 파일)이 있습니다. 이것은 선택 사항입니다. 파일이 존재하면 FileBasedImpl을 사용하여 파일에서 데이터를 읽어야합니다. 그렇지 않으면, 내가 하드 코드 된 데이터를 반환하는 "DefaultImpl"클래스에서 데이터를 가져와야합니다.

어떻게 guice 바인딩에서이 문제를 해결할 수 있습니까?

interface SomeService { 
    Map<String, String> getData(); 
} 

class FileBasedImpl implements SomeService { 
    /* Reads from a file */ 
    Map<String, String> getData() { 
     //Check if file is present, then read the data 
    } 
} 

class DefaultImpl implements SomeService { 
    /* Returns hard-coded data */ 
    Map<String, String> getData() { 
    return new HashMap()<>..; 
    } 
} 
의 내용을 읽고 한 결과에 따라 다른 콩 제공하려고 당신은 (어느 인터페이스를 구현하거나이 모듈에 방법을 제공 추가) 공급자를 만들 수

답변

1

:

... 
@Provides 
public SomeService someService() { 
    File file = ....; 
    return (file.exists) ? new FileBasedImpl(file) : new DefaultImpl(); 
} 
... 

모듈의 조건부 논리는 documented anti-pattern입니다. 그러나 이와 같은 경우에는 때때로 좋은 결과를 얻을 수있는 좋은 해결책입니다 ...

관련 문제