将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)这一架构,真的很厉害,我再次深感佩服。

广告
将在 10 秒后关闭
bannerAds