为什么是dagger2?我们可以手动创建所需的类对象和注入
我是从https://developer.安卓.com/training/dependency-injection知道安卓依赖注入的。没有dagger2,我们可以创建如下对象并使用它(构造函数注入)。使用匕首2有什么意义?设计模式的好处在于将以下好处归档
- 易于测试
- 代码的可重用性
- 易于重构
但我的问题是,没有匕首-2,我们也能做到这一点。那我们要用匕首2做什么呢
Without Dagger2
引擎
public class Engine {
public Engine()
{
}
}
轮子
public class Wheels {
public Wheels()
{
}
}
汽车
public class Car {
private static final String TAG = "Car";
private Engine engine;
private Wheels wheels;
public Car(Engine engine,Wheels wheels)
{
this.engine=engine;
this.wheels=wheels;
}
public void drive()
{
Log.d(TAG, "driving");
}
}
MainActivity.class
public class MainActivity extends AppCompatActivity {
private Car car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Engine engine=new Engine();
// Wheels wheels=new Wheels();
car=new Car(new Engine(),new Wheels());
car.drive();
}
}
With Dagger-2
引擎
public class Engine {
@Inject
public Engine()
{
}
}
轮子
public class Wheels {
@Inject
public Wheels()
{
}
}
汽车
public class Car {
private static final String TAG = "Car";
private Engine engine;
private Wheels wheels;
@Inject
public Car(Engine engine,Wheels wheels)
{
this.engine=engine;
this.wheels=wheels;
}
public void drive()
{
Log.d(TAG, "driving");
}
}
汽车零部件
@component
public interface CarComponent{
Car getCar();
}
MainActivity.class
public class MainActivity extends AppCompatActivity {
private Car car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CarComponent carComponent=DaggerCarComponent.create();
carComponent.getCar();
car.drive();
}
}
# 1 楼答案
从你自己的例子来看,这应该很明显:
所以在这里,每次你想要得到一辆车的时候,你都必须创建一个新的
Engine
实例和一个新的Wheels
实例。让我们考虑一下:如果汽车现在需要一个新部件作为参数,会发生什么
您必须将此依赖项添加到汽车对象的每个单独创建中
让我们考虑一下如果你的依赖项本身有依赖关系:
会发生什么?因此,在创建所需的对象之前,您将不得不创建大量依赖项,并且您将在项目中的任何地方、每一次都这样做,这就是使用依赖项注入/反转框架(这与dagger无关,这是一个通用的东西)来帮助您管理依赖项的意义所在