首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger 2-2提供了提供相同接口的方法。

Dagger 2-2提供了提供相同接口的方法。
EN

Stack Overflow用户
提问于 2016-10-10 08:13:00
回答 4查看 27.5K关注 0票数 46

让我说:

代码语言:javascript
复制
public interface Shape  {}


public class Rectangle implements Shape {

}

public class Circle implements Shape {

}

我有一个ApplicationModule,它需要为Rec循环提供实例

代码语言:javascript
复制
@Module
public class ApplicationModule {
    private Shape rec;
    private Shape circle;

    public ApplicationModule() {
        rec = new Rectangle();
        circle= new Circle ();
    }

    @Provides
    public Shape provideRectangle() {
        return rec ;
    }

    @Provides
    public Shape provideCircle() {
        return circle;
    }
}

ApplicationComponent

代码语言:javascript
复制
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    Shape provideRectangle();
}

用代码的方式-它不会编译。错误说法

错误:(33,20)错误:形状被多次绑定。

这对我来说是有意义的,因为组件正在试图找到一个Shape实例,并且它找到了其中的两个,所以它不知道返回哪个实例。

我的问题是-我怎么处理这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-10 20:12:25

我最近在这篇文章中给出了这样一个问题的答案:

Dagger 2:获得具有@Named的同一个对象的多个实例时出错

需要在模块中使用@Named("someName"),如下所示:

代码语言:javascript
复制
@Module
public class ApplicationModule {
private Shape rec;
private Shape circle;

public ApplicationModule() {
    rec = new Rectangle();
    circle= new Circle ();
}

@Provides
 @Named("rect")
public Shape provideRectangle() {
    return rec ;
}

@Provides
 @Named("circle")
public Shape provideCircle() {
    return circle;
}

}

然后在需要注入它们的地方,只需编写

代码语言:javascript
复制
@Inject
@Named("rect")
 Shape objRect;

这很有趣,但你必须用另一种方式在科特林注射:

代码语言:javascript
复制
@field:[Inject Named("rect")]
lateinit var objRect: Shape
票数 63
EN

Stack Overflow用户

发布于 2016-10-10 17:46:56

@Qualifier注释是区分具有相同类型的不同实例或注入请求的正确方法。主用户指南页面有关于他们的整整一节

代码语言:javascript
复制
@Qualifier @Retention(RUNTIME)
public interface Parallelogram {} /* name is up to you */

// In your Module:
@Provides @Parallelogram
public Shape provideRectangle() {
    return rec ;
}

// In your other injected types:
@Inject @Parallelogram Shape parallelogramShape;
// or
@Inject @Parallelogram Provider<Shape> parallelogramShapeProvider;

// In your Component:
@Parallelogram Shape provideRectangle();

旁白:虽然我同意sector11的观点,即您不应该在注入类型中使用new,但如果需要的话,模块正是调用new的正确位置。除了添加限定符注释之外,我认为您的模块对我来说非常合适。

与自定义限定符注释相比,编辑有关@命名的用法的

  • @Named是一个内置的@Qualifier注释,很像我上面创建的注释。对于简单的情况,它工作得很好,但是因为绑定只是一个字符串,所以在检测有效的键或自动完成键时,IDE不会提供太多的帮助。
  • 与命名的字符串参数一样,自定义限定符可以具有字符串、原语、枚举或类文字属性。对于枚举,IDE通常可以自动完成有效值。
  • 通过在组件方法上指定注释,可以以完全相同的方式从注释中访问@Named和自定义限定符,就像我前面对@Parallelogram所做的那样。
票数 16
EN

Stack Overflow用户

发布于 2016-10-10 20:47:10

我不认为在new的构造函数中使用Module运算符是个好主意。这将在初始化对象图时(即调用new ApplicationModule()时)创建每个提供对象的实例,而不是达格尔第一次需要该对象的时候。在这种情况下(只有两个对象),它可以忽略不计,但在较大的项目中,这可能会在应用程序启动时造成瓶颈。相反,我将遵循@sector11 11的建议,并在@Provides注释的方法中实例化您的对象。

至于提供两个相同类型的对象,@Jeff和@Amir都是正确的。可以使用提供的@Named()限定符,也可以创建自己的限定符,如下所示:

代码语言:javascript
复制
@Qualifier @Retention(RetentionPolicy.RUNTIME)
public @interface RectangleShape {}

@Qualifier @Retention(RetentionPolicy.RUNTIME)
public @interface CircleShape {}

那么您的ApplicationModule应该如下所示:

代码语言:javascript
复制
@Module
public class ApplicationModule {

    @Provides @RectangleShape // @Named("rectangle")
    public Shape provideRectangle() {
        return new Rectangle();
    }

    @Provides @CircleShape // @Named("circle")
    public Shape provideCircle() {
        return new Circle();
    }

}

这样,就可以将这些对象注入到类中,如下所示:

代码语言:javascript
复制
@Inject @RectangleShape /* @Named("rectangle") */ public Shape mRectangle;
@Inject @CircleShape /* @Named("circle") */ public Shape mCircle;

如果需要在不使用Shape注释的情况下提供@Inject类的实例,则可以在Component类中这样做:

代码语言:javascript
复制
@Component(modules = { ApplicationModule.class })
public interface ApplicationComponent {

    void inject(MyApplication application);

    @RectangleShape // @Named("rectangle")
    Shape getRectangle();

    @CircleShape // @Named("circle")
    Shape getCircle();

}

这些方法将提供由@Provides注释的方法提供的每个类的相同实例。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39953933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档