[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-22-rust-yilai-zhuru-servicelocator-arc-trait":3},{"article":4,"author":51},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":31,"related_articles":32},"d3000000-0000-0000-0000-000000000122","a0000000-0000-0000-0000-000000000036","Deep EVM #22：Rust中的依赖注入——ServiceLocator、Arc和Trait对象","deep-evm-22-rust-yilai-zhuru-servicelocator-arc-trait","Rust中的依赖注入模式：ServiceLocator、Arc共享所有权和trait对象实现可测试、可维护的系统。","## Rust中的依赖注入\n\nRust没有传统OOP语言中的DI框架，但trait系统提供了强大的替代方案。\n\n## Trait对象作为接口\n\n```rust\ntrait PriceProvider: Send + Sync {\n    fn get_price(&self, pair: &str) -> Result\u003Cf64, Error>;\n}\n\nstruct LivePriceProvider { \u002F* ... *\u002F }\nstruct MockPriceProvider { prices: HashMap\u003CString, f64> }\n\nimpl PriceProvider for LivePriceProvider { \u002F* ... *\u002F }\nimpl PriceProvider for MockPriceProvider { \u002F* ... *\u002F }\n```\n\n## Arc共享所有权\n\n```rust\nstruct AppState {\n    price_provider: Arc\u003Cdyn PriceProvider>,\n    db_pool: Arc\u003CPgPool>,\n}\n```\n\n## ServiceLocator模式\n\nServiceLocator集中管理所有服务的创建和生命周期：\n\n```rust\nstruct ServiceLocator {\n    services: HashMap\u003CTypeId, Box\u003Cdyn Any + Send + Sync>>,\n}\n\nimpl ServiceLocator {\n    fn register\u003CT: 'static + Send + Sync>(&mut self, service: T) {\n        self.services.insert(TypeId::of::\u003CT>(), Box::new(service));\n    }\n    \n    fn resolve\u003CT: 'static>(&self) -> Option\u003C&T> {\n        self.services.get(&TypeId::of::\u003CT>())\n            .and_then(|s| s.downcast_ref())\n    }\n}\n```\n\n## 可测试性\n\n通过trait对象，你可以在测试中轻松替换依赖：\n\n```rust\n#[tokio::test]\nasync fn test_with_mock() {\n    let mock_provider = Arc::new(MockPriceProvider::new());\n    let state = AppState { price_provider: mock_provider, \u002F* ... *\u002F };\n    \u002F\u002F 使用mock进行测试\n}\n```\n\n## 总结\n\nRust的trait系统和Arc智能指针提供了优雅的依赖注入解决方案，无需重量级DI框架即可实现松耦合和高可测试性。","\u003Ch2 id=\"rust\">Rust中的依赖注入\u003C\u002Fh2>\n\u003Cp>Rust没有传统OOP语言中的DI框架，但trait系统提供了强大的替代方案。\u003C\u002Fp>\n\u003Ch2 id=\"trait\">Trait对象作为接口\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">trait PriceProvider: Send + Sync {\n    fn get_price(&amp;self, pair: &amp;str) -&gt; Result&lt;f64, Error&gt;;\n}\n\nstruct LivePriceProvider { \u002F* ... *\u002F }\nstruct MockPriceProvider { prices: HashMap&lt;String, f64&gt; }\n\nimpl PriceProvider for LivePriceProvider { \u002F* ... *\u002F }\nimpl PriceProvider for MockPriceProvider { \u002F* ... *\u002F }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"arc\">Arc共享所有权\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">struct AppState {\n    price_provider: Arc&lt;dyn PriceProvider&gt;,\n    db_pool: Arc&lt;PgPool&gt;,\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"servicelocator\">ServiceLocator模式\u003C\u002Fh2>\n\u003Cp>ServiceLocator集中管理所有服务的创建和生命周期：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">struct ServiceLocator {\n    services: HashMap&lt;TypeId, Box&lt;dyn Any + Send + Sync&gt;&gt;,\n}\n\nimpl ServiceLocator {\n    fn register&lt;T: 'static + Send + Sync&gt;(&amp;mut self, service: T) {\n        self.services.insert(TypeId::of::&lt;T&gt;(), Box::new(service));\n    }\n    \n    fn resolve&lt;T: 'static&gt;(&amp;self) -&gt; Option&lt;&amp;T&gt; {\n        self.services.get(&amp;TypeId::of::&lt;T&gt;())\n            .and_then(|s| s.downcast_ref())\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">可测试性\u003C\u002Fh2>\n\u003Cp>通过trait对象，你可以在测试中轻松替换依赖：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">#[tokio::test]\nasync fn test_with_mock() {\n    let mock_provider = Arc::new(MockPriceProvider::new());\n    let state = AppState { price_provider: mock_provider, \u002F* ... *\u002F };\n    \u002F\u002F 使用mock进行测试\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">总结\u003C\u002Fh2>\n\u003Cp>Rust的trait系统和Arc智能指针提供了优雅的依赖注入解决方案，无需重量级DI框架即可实现松耦合和高可测试性。\u003C\u002Fp>\n","zh","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:26.306508Z","Rust中的依赖注入——ServiceLocator、Arc和Trait对象","Rust依赖注入模式：ServiceLocator、Arc共享所有权、trait对象和可测试的系统设计。","依赖注入 rust",null,"index, follow",[22,27],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000022","Performance","performance","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust","工程",[33,39,45],{"id":34,"title":35,"slug":36,"excerpt":37,"locale":12,"category_name":31,"published_at":38},"d0000000-0000-0000-0000-000000000668","为什么Bali在2026年正在成为东南亚的影响力科技中心","weishenme-bali-2026-zhengzai-chengwei-dongnanya-yingxiangli-keji-zhongxin","Bali在东南亚创业生态系统中排名第16位。随着Web3构建者、AI可持续发展初创公司和生态旅游科技公司的集中，该岛正在打造区域影响力科技之都的独特定位。","2026-03-28T10:44:48.898750Z",{"id":40,"title":41,"slug":42,"excerpt":43,"locale":12,"category_name":31,"published_at":44},"d0000000-0000-0000-0000-000000000667","ASEAN数据保护拼图：开发者合规清单","asean-shuju-baohu-pintu-kaifazhe-heguiqingdan","七个ASEAN国家现已拥有全面的数据保护法律，各自具有不同的同意模型、本地化要求和处罚结构。这是一份为构建多国应用程序的开发者准备的实用合规清单。","2026-03-28T10:44:48.893467Z",{"id":46,"title":47,"slug":48,"excerpt":49,"locale":12,"category_name":31,"published_at":50},"d0000000-0000-0000-0000-000000000666","Indonesia 290亿美元数字化转型：软件公司的机遇","indonesia-290yi-meiyuan-shuzihua-zhuanxing-ruanjian-gongsi-jiyu","Indonesia IT服务市场预计在2026年达到290.3亿美元，高于2025年的243.7亿美元。云基础设施、AI、电子商务和数据中心正在推动东南亚最快的增长。","2026-03-28T10:44:48.875457Z",{"id":13,"name":52,"slug":53,"bio":54,"photo_url":19,"linkedin":19,"role":55,"created_at":56,"updated_at":56},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]