Rust中使用enum_dispatch实现静态分发时的分层设计循环依赖问题及解决方案咨询
Rust中使用enum_dispatch实现静态分发时的分层设计循环依赖问题及解决方案咨询
各位Rust开发者们,我现在遇到了一个分层设计和enum_dispatch结合的头疼问题,想请教大家有没有合适的解决方案:
我正在设计一个分为三层的系统:
- 抽象层(al):定义了Trait和通用数据结构
- 实现层(il):不同的结构体实现抽象层的Trait
- 业务层(bl):根据给定配置运行系统,依赖抽象层的公共接口和实现层的具体结构体
目前的依赖关系是:il依赖al(因为要实现Trait),bl同时依赖al和il。
现在的核心问题出在enum_dispatch的使用上:
在al层我定义了一个带#[enum_dispatch]注解的Rest Trait,里面包含了近20个网络服务相关的方法;il层的Foo和Boo都实现了这个Rest Trait。
我原本打算在bl层通过enum_dispatch实现静态分发,代码大概是这样的:
#[enum_dispatch(Rest)] pub enum Item { Foo, Boo }
这样我就能像动态分发一样直接在不同枚举变体上调用Trait方法,但性能却和静态分发一样好。
但enum_dispatch有个硬性要求:被注解的Trait和对应的枚举必须定义在同一个crate里。这就带来了两个麻烦:
- 如果把al和bl合并成一个crate,就破坏了我原本分层解耦的设计初衷
- 就算强行合并,al和il会形成互相依赖的循环,导致依赖图中出现多个版本的al crate,引发循环依赖问题
另外,手动给这个枚举实现Rest Trait几乎是不可能的——毕竟这个Trait有近20个方法,工作量太大了。
想请教大家,有没有办法能让我保持三层的独立crate结构,不用把它们合并成一个,同时还能实现想要的静态分发效果?
内容来源于stack exchange
相关产品推荐
相关产品推荐

