2016-10-06 24 views
1

여러 활동이 있고 각 활동마다 별도의 Dagger2 구성 요소가 들어 있다고 가정 해 보겠습니다. 그래서 FooActivityFooComponent이고 BarActivityBarComponent입니다. 또한 일부 뷰 그룹을 두 활동 모두에서 사용할 수 있고 단검 그래프를 통해 일부 종속성을 받아야합니다 BazViewGroup 가정 해 봅시다. 이 뷰 그룹의 인스턴스에 종속성을 주입하는 가장 좋은 방법은 그것이 속한 활동을 미리 알지 못하기 때 문입니다.다른 Dagger2 구성 요소의 같은 클래스에 주입하는 방법은 무엇입니까?

  1. 모든 활동이 활동
  2. 모든 구성 요소에 포함 된 구성 요소를 반환하는 방법 getComponent() 공개 인터페이스와 같은

    public interface CanInjectIntoBazViewGroup { 
        void inject(BazViewGroup viewgroup); 
    } 
    
  3. 내부 BazViewGroup의 constructor에 확장 :

    는 지금은 다음과 같은 설정을 가지고 나는 액티비티에 대한 참조를 얻고, 컴포넌트를 얻으려면 CanInjectIntoBazViewGroup으로 캐스팅하고 inject 메서드를 호출하십시오.

더 좋은 방법이 있습니까?

답변

0

단검 2의 모범 사례는 (다른 것처럼) 그것을 남용하는 것이 아닙니다. 이미 Activities에 대한 구성 요소를 가지고, 당신은 모두 Activities에서 BazViewGroup에 대한 참조가있는 경우

그래서, 나는이 BazViewGroup에 DI를 수행하기 위해 단검이 사용하는 어떤 이유가 표시되지 않습니다.

두 가지 경우가 있습니다. -이 객체에 setXYZ() 같은 방법을 정의하고 XYZ을 통과하면 XML에 BazViewGroup를 선언하고, 당신이 "방법 DI는"수행 할 수있는 안드로이드가 팽창 할 경우

:

뷰 그룹은 XML에 선언 뷰 계층 구조가 비정상적으로 증가한 후 Activities에서

당신은 프로그래밍 뷰 그룹을 만듭니다

프로그래밍 방식으로 ViewGroup을 인스턴스화하는 경우에, 당신은 생성자 매개 변수로 종속성을 추가 할 수 있습니다.

두 접근법은 Activity과 내부가 ViewGroup 사이에 약간의 연결을 생성하기 때문에 깨끗하지는 않지만 대거 프레임 워크에 ViewGroup을 연결하는 것보다 훨씬 좋습니다.

더 깨끗한 방법은 ViewGroup에서 이러한 종속성을 제거하는 것입니다. 사용자 상호 작용에 대한 몇 가지 작업을 수행하거나 데이터를 쿼리하기 위해 필요하다고 생각하십니까? 콜백 인터페이스를 생성하지 않고 이러한 모든 작업을 동봉 한 Activity에 위임하는 이유는 무엇입니까? 이런 식으로 언젠가 비즈니스 로직을 리팩터링하면 Views 커스텀은 영향을받지 않을 것입니다.

관련 문제