1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//! # TIPS
//!
//! ### Hide `DIProvider` implementation details.
//!
//! The PortalDI's macro generates `DIProvider` implementation block next to a target struct.
//! And you needs import the DIProvider into dependent's scope.
//!
//! ```
//! mod tips1 {
//!
//! mod service {
//! use portaldi::*;
//!
//! pub trait FooI: DITarget {}
//! pub trait BarI: DITarget {}
//! }
//!
//! mod foo_impl {
//! use portaldi::*;
//! use super::service::*;
//!
//! #[derive(DIPortal)]
//! #[provide(FooI)]
//! pub struct Foo {}
//! impl FooI for Foo {}
//! }
//!
//! mod bar_impl {
//! use portaldi::*;
//! use super::service::*;
//!
//! #[derive(DIPortal)]
//! #[provide(BarI)]
//! pub struct Bar {}
//! impl BarI for Bar {}
//! }
//!
//! use portaldi::*;
//! use foo_impl::FooIProvider; // must be in this scope
//! use bar_impl::BarIProvider; // must be in this scope
//! use service::*;
//!
//! #[derive(DIPortal)]
//! struct Hoge {
//! foo: DI<dyn FooI>,
//! bar: DI<dyn BarI>,
//! }
//! }
//!
//! ```
//!
//! You may want to avoid this implementation imports.
//! In that case, add provider barrel module with re-export to hide detailed imports.
//!
//!
//! ```
//! mod tips1 {
//!
//! mod service {
//! use portaldi::*;
//!
//! pub trait FooI: DITarget {}
//! pub trait BarI: DITarget {}
//! }
//!
//! mod foo_impl {
//! use portaldi::*;
//! use super::service::*;
//!
//! #[derive(DIPortal)]
//! #[provide(FooI)]
//! pub struct Foo {}
//! impl FooI for Foo {}
//! }
//!
//! mod bar_impl {
//! use portaldi::*;
//! use super::service::*;
//!
//! #[derive(DIPortal)]
//! #[provide(BarI)]
//! pub struct Bar {}
//! impl BarI for Bar {}
//! }
//!
//! mod providers {
//! pub use super::foo_impl::FooIProvider;
//! pub use super::bar_impl::BarIProvider;
//! }
//!
//! use portaldi::*;
//! use providers::*;
//! use service::*;
//!
//! #[derive(DIPortal)]
//! struct Hoge {
//! foo: DI<dyn FooI>,
//! bar: DI<dyn BarI>,
//! }
//! }
//!
//! ```
//!
//!