2016-01-11 22 views
7

Tôi mới dùng Dagger 2, cố gắng chuyển một ứng dụng phức tạp (khá) sang nó.Đồ thị phụ thuộc Dagger 2 mô-đun: bị ràng buộc nhiều lần

Chúng tôi có một số phụ thuộc vào thư viện 'phổ biến' (được chia sẻ với các dự án khác). Những thư viện 'phổ biến' đôi khi phụ thuộc vào các thư viện 'phổ biến' khác. Mỗi thư viện hiển thị một mô-đun.

Một ví dụ:

@Module 
public class JsonModule { 
    @Provides 
    public Mapper provideMapper(ObjectMapper objectMapper) { 
     return new DefaultMapper(objectMapper); 
    } 

    @Provides 
    public ObjectMapper provideObjectMapper() { 
     return ObjectMapperFactory.build(); 
    } 
} 

chúng tôi HttpModule phụ thuộc vào JsonModule:

@Module(includes = {JsonModule.class}) 
public class HttpModule { 
    public HttpHelper provideHttpHelper(ObjectMapper objectMapper) { 
     return new DefaultHttpHelper(objectMapper); 
    } 
} 

Cuối cùng trong ứng dụng của tôi, tôi phụ thuộc vào cả hai module:

@Module(includes = {JsonModule.class, HttpModule.class}) 
public class MyAppModule { 
    public Service1 provideService1(ObjectMapper objectMapper) { 
     return new DefaultService1(objectMapper); 
    } 

    public Service2 provideService2(Mapper mappper) { 
     return new DefaultService2(mappper); 
    } 
} 

tôi sau đó có 1 thành phần phụ thuộc vào MyAppModule của tôi:

@Component(modules = MyAppModule.class) 
@Singleton 
public interface MyAppComponent { 
    public Service2 service2(); 
} 

Thật không may, khi tôi lập dự án, tôi nhận được một Dagger trình biên dịch báo lỗi:

[ERROR] com.company.json.Mapper is bound multiple times: 
[ERROR] @Provides com.company.json.Mapper com.company.json.JsonModule.provideMapper(com.company.json.ObjectMapper) 
[ERROR] @Provides com.company.json.Mapper com.company.json.JsonModule.provideMapper(com.company.json.ObjectMapper) 

Tôi đang làm gì sai? Có sai khi phụ thuộc vào một mô-đun hai lần trong cùng một biểu đồ phụ thuộc không?

+0

có thể vì bạn đưa nó vào HttpModule và một lần nữa trong MyAppModule, hãy thử xóa 'include JsonModule' ở một trong những địa điểm đó –

Trả lời

1

Nó có vẻ như vấn đề có liên quan đến tình hình của dự án của chúng tôi:

  • các dự án chung kết hợp Groovy và Java
  • các dự án chung được xây dựng sử dụng Gradle
  • các dự án ứng dụng kết hợp Groovy và Java
  • dự án ứng dụng được xây dựng bằng Maven và trình biên dịch groovy-eclipse

Cơ bản: Tôi đổ lỗi cho trình biên dịch groovy-eclipse-cho bây giờ. Tôi đã chuyển đổi dự án thành Gradle và mọi thứ đều hoạt động ngay bây giờ.

7

Trong số MyAppModule bạn không nên bao gồm JsonModule, nó được bao gồm bởi dagger ngầm. Khi bao gồm HttpModule dao găm sẽ tự động bao gồm tất cả các mô-đun mà HttpModule bao gồm (trong trường hợp của bạn là JsonModule).

Các vấn đề liên quan