2016-06-15 2 views
2

내가 직면 한 문제는 실제로 부모 - 자식 계층 구조에 속하지 않는 두 개의 독립 범위를 갖기를 원한다는 것입니다. 필자의 경우 두 가지 유형의 범위가 필요합니다.단검 2 - 독립적으로 범위가 지정된 여러 구성 요소를 단일 개체로 주입

1) "기능"기반 범위. 예를 들어 사용자가 기능을 입력하면 범위가 지정된 구성 요소가 만들어집니다. 사용자가 해당 기능을 종료하면 해당 범위가 삭제됩니다.

2) "활동"기반 범위 (Android 앱의 경우, 안드로이드를 사용하지 않는 경우 미안합니다). 활동이 작성되면 범위가 지정된 구성 요소가 작성됩니다. 활동이 파괴되면 그 범위는 파괴됩니다.

하위 구성 요소 또는 구성 요소 종속성은 내가 수행 한 작업에 적용됩니다. 이는 활동이 파괴되기 전에 기능이 종료 될 수 있기 때문입니다. 마찬가지로 활동이 완료되기 전에 활동이 종료 될 수 있습니다.

나는 멤버 주입 방법 대신 프로비저닝 방법을 사용할 수 있고 두 개의 개별 구성 요소를 보유 할 수 있다는 것을 알고 있지만, 단지 하나의 객체에 모든 내 의존성을 적용 할 수있는 단순성을 원한다. 다른 사람이 이것에 대해 어떤 생각을 가지고 있습니까?

+2

기능에 일반적으로 잘 정의 된 라이프 사이클이 없으므로 범위를 기능과 일치 시키려고 할 때 매우 어려울 것입니다. 예 : 계정 관리 기능에는 로그인 관리를위한 활동 수준의 개체가있을 수 있지만 로그인 한 사용자의 개념은 일반적인 안드로이드 개체 수명주기를 확장 할 수 있습니다. feature _modules_를 만들고 기능이 필요한 구성 요소에 설치하는 것이 좋습니다. 독립적으로 수행해야하는 상태 관리가있는 경우 수동으로 수행하고 범위가 지정되지 않은 제공 업체에 주입하십시오. – gk5885

+0

답장을 보내 주셔서 감사합니다. 특히 작성자의 의견을 듣는 것이 좋습니다. Btw는 단지 상태 관리가 아니라 Btw가 붙어있는 객체 때문에 같은 인스턴스가 "기능"의 수명 동안 주입되도록하고 싶습니다. 예를 들어, 사용자가 로그 아웃하도록 선택하면 범위가 끝날 수 있으며 이는 많은 Android 객체에 걸쳐 있음에도 불구하고 잘 정의됩니다. 일반적인 활동이나 조각 기반 탐색을 사용하면 사용자가 현재 어떤 범위의 기능을 사용하고 있는지 알기가 어렵습니다. 그러나 [Flow] (https://github.com/square/flow)를 사용하면 정말 쉽습니다. –

답변

0

이것은 내가 생각할 수있는 최상의 해결책입니다. 내 Activity 관련 객체를 내 응용 프로그램의 다른 상태에 연결하는 것과 같은 방식으로 느꼈다.

응용 프로그램 범위, 활동 범위 및 일부 기능 범위 (예 : 프로필 정보가있는 사용자 로그인 상태 등)의 세 가지 범위가 있다고합시다. 활동 및 기능 범위는 응용 프로그램 범위의 하위 항목이지만 기능 및 활동은 관련되지 않은 형제입니다.

추천 범위 개체를 직접 활동에 직접 삽입하지 마십시오. 대신 피쳐 스코프 측면에 게터가 포함 된 브릿지를 삽입하십시오.

예 :

public interface UserManager { 
    @Nullable 
    User getLoggedInUser(); 

    @Nullable 
    ShoppingCart getShoppingCart(); 
} 

사용자가 또는 다른 개체에 액세스하려고 할 때 기록되지 않을 수 있기 때문에이 방법이 널입니다. null 인 경우, 사용자는 로그인하지 않습니다. 이 기능은 활성화되지 않습니다.

활동 범위에서 아무 것도 참조하지 않기 때문에이 기능의 구현은 기능 범위 측면에서 자유롭게 종속성 주입을 수행합니다.

public class UserManagerImpl implements UserManager { 
    @Inject 
    ShoppingCart cart; 

    @Inject 
    User user; 

    public UserManagerImpl(MyApplication application){ 
     UserScopeComponent component = application.getUserComponent(); 
     if(component != null) { 
      //only attempt injection if the component exists (user is logged in) 
      component.inject(this); 
     } 
    } 

    //put simple getters here. They will return null objects if the component didnt inject anything. 
} 

ApplicationModule은이 개체를 제공합니다. 응용 프로그램 범위 나 싱글 톤이 아닙니다. 로그인 상태가 변경된 경우 주입 할 때마다 다시 초기화하려고합니다. 다음 앱의 어느 곳에서 UserManager를 주입의 게터를 호출, 출력이 null가 아닌 경우 확인하고, 멀리 갈 수부터

@Provides 
//No Scope 
UserManager provideUserManager(){ 
    return new UserManagerImpl(context); 
} 

. Feature 상태는 더 이상 활동 상태와 결합되지 않으며 자유롭게 될 수 있습니다.

관련 문제