将DI框架Zenject和Spring进行比较
我试着比较了DI框架Zenject和Spring。
最近,我有机会接触到Unity的依赖注入框架Zenject。因为我以前在工作中使用过Java的依赖注入框架Spring(确切地说是面向Web开发的Spring Boot),所以我想进行一下比较。
如果你对什么是 DI(Dependency Injection)感兴趣的话,可以查看我以前写过的这篇文章,它通过一个有关肥胖问题的故事来解释 DI。
字段注入
在类的字段中添加注入配置被称为字段注入。在Zenject中使用[Inject],在Spring中使用@Autowired。写法非常相似呢。
public class Sample
{
[Inject]
private Foo _foo;
[Inject]
private Bar _bar;
}
@Component
public class Sample {
@Autowired
private Foo _foo;
@Autowired
private Bar _bar;
}
构造函数注入
关于构造函数注入,没有特别的差异。
public class Sample
{
private Foo _foo;
private Bar _bar;
public Sample(Foo foo, Bar bar)
{
_foo = foo;
_bar = bar;
}
}
public class Sample {
private Foo _foo;
private Bar _bar;
public Sample(Foo foo, Bar bar) {
_foo = foo;
_bar = bar;
}
}
我感觉在Spring领域里,人们更倾向于积极利用构造函数注入而不是尽量避免使用字段注入,但是在Zenject领域里,并没有特别强调这一点的声音。
单例模式
在Spring中,将实例与容器相关联的操作称为单例。而在Zenject中,则有一个名为AsSingle()的方法。
public class HogeInstaller : MonoInstaller
{
public override void InstallBindings()
{
Container.Bind<Sample>().AsSingle();
}
}
在Spring中,我们使用@Scope(“singleton”)注解。
@Configuration
public class AppConfig {
@Bean
@Scope("singleton")
public Sample sample(){
return new Sample();
}
}
然而,对于Spring来说,默认情况下是单例模式,所以实际上可以省略 @Scope(“singleton”)。
瞬时 / 原型
在Spring中,我们将每次有注入请求时生成不同的实例称为原型(Prototype),而在Zenject中则称之为瞬态(Transient),并且不再重用实例。
在Zenjct中,使用AsTransient()函数。
public class HogeInstaller : MonoInstaller
{
public override void InstallBindings()
{
Container.Bind<Sample>().AsTransient();
}
}
在Spring框架中,使用@Scope(“prototype”)。
@Configuration
public class AppConfig {
@Bean
@Scope("prototype")
public Sample sample(){
return new Sample();
}
}
最后
可能是因为C#和Java很相似,所以我觉得Zenject和Spring也很相似。
Spring用于Web后端开发,而Zenject用于游戏系统开发,使用场景完全不同,但无论是哪一个领域,都能使用依赖注入(DI)这一架构,真的很厉害,我再次深感佩服。