이것은 내가 생각할 수있는 최상의 해결책입니다. 내 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 상태는 더 이상 활동 상태와 결합되지 않으며 자유롭게 될 수 있습니다.
기능에 일반적으로 잘 정의 된 라이프 사이클이 없으므로 범위를 기능과 일치 시키려고 할 때 매우 어려울 것입니다. 예 : 계정 관리 기능에는 로그인 관리를위한 활동 수준의 개체가있을 수 있지만 로그인 한 사용자의 개념은 일반적인 안드로이드 개체 수명주기를 확장 할 수 있습니다. feature _modules_를 만들고 기능이 필요한 구성 요소에 설치하는 것이 좋습니다. 독립적으로 수행해야하는 상태 관리가있는 경우 수동으로 수행하고 범위가 지정되지 않은 제공 업체에 주입하십시오. – gk5885
답장을 보내 주셔서 감사합니다. 특히 작성자의 의견을 듣는 것이 좋습니다. Btw는 단지 상태 관리가 아니라 Btw가 붙어있는 객체 때문에 같은 인스턴스가 "기능"의 수명 동안 주입되도록하고 싶습니다. 예를 들어, 사용자가 로그 아웃하도록 선택하면 범위가 끝날 수 있으며 이는 많은 Android 객체에 걸쳐 있음에도 불구하고 잘 정의됩니다. 일반적인 활동이나 조각 기반 탐색을 사용하면 사용자가 현재 어떤 범위의 기능을 사용하고 있는지 알기가 어렵습니다. 그러나 [Flow] (https://github.com/square/flow)를 사용하면 정말 쉽습니다. –