Rust 如何实现依赖注入?
要应用“依赖注入”模式,你需要遵循两个简单的准则:
1.将对象的构造与使用分开。在实践中,停止在构造函数中创建对象,而是将这些对象作为输入参数。
2.使用接口而不是具体类型作为构造函数的参数。通过这种方式,接收方没有接收接口的具体类型,因此可以提供不同的实现。
依赖注入不仅是可测试性的关键,也是一个很好的设计原则,因为它保持了系统各部分松散耦合。最好的一点是依赖注入是一个简单的概念,不需要花哨的框架。
至于如何定义通用接口,技术上取决于你选择的语言。在 c++中,可以定义纯抽象类;在 Java, Go 和 c#中,可以定义接口;在 Rust 中,使用 Trait。
那么,如何使用 Trait 来实现依赖注入?当依赖注入模式被正确应用时,一个库 crate 就会体现出:
(1)Trait 代表一个重量级对象;
(2)实现这些 Trait 的对象集合;
(3)通过泛型 Trait,函数使用这些对象;
然后,库的使用者实例化他们需要的特定对象,将它们连接在一起以创建依赖关系图,并将它们提供给库公开的通用业务逻辑函数。
不过,在 Rust 中使用 trait 进行依赖注入的关键问题是,函数签名中引用的任何类型必须至少和函数本身一样可见。这意味着,如果 Trait 是 public 的,那么任何特征函数引用的任何类型也必须是 public 的。
评论