我是一个实现依赖注入的小型C ++库的作者(我想有人会称它为“IoC容器”)。
我一直认为找一个图书馆的好隐喻可以在很多方面提供帮助:
现在,在我的库中,我使用了设备/插件比喻:你的类是“设备”,它们的依赖是“插件”,你可以在另一个设备上连接插件。这是一个代码示例:
REGISTERED_CLASS( Foo ), public Device
{
...
private:
Plug< Bar > bar;
...
};
...
catalog.Create( "myFoo", "Foo" );
catalog.Create( "myBar", "Bar" );
...
catalog[ "myFoo" ].Plug( "bar" ).Into( catalog[ "myBar" ] ); // this means myFoo.bar = myBar
嗯,我对这个比喻并不十分满意,因为:
MultiplePlug< T >
(它基本上是std::list< Plug< T > >
),但听起来不太好:现实世界中的“多重插头”是什么?Here你可以找到我的图书馆。 你对一个更适合我的代码的比喻有什么建议吗?
(尽管如此,如果您对图书馆有任何其他好的建议,欢迎他们!)
非常感谢。
注意:我知道主题为“什么是依赖注入的一个很好的比喻”的另一个问题,但这不是它的重复。
修改:This是对着名博客文章评论中主题的讨论。
Edit2 :最后,我决定将语法更改为更好更简单的语法:
// explicit catalog
use( myCatalog["myBar"] ).as( "bar" ).of( myCatalog["myFoo"] );
// implicit catalog:
within( myCatalog )
{
use( "myBar" ).as( "bar" ).of( "myFoo" );
...
}
答案 0 :(得分:2)
我认为这是针对配置阶段的。如果您坚持使用Plug
和Into
术语:
// this means myFoo.bar = myBar
catalog[ "myFoo" ].Into( "bar" ).Plug( catalog[ "myBar" ] );
其中Plug
用作动词,即“插入”。如果您创建一个流畅的界面尝试制定有意义的句子。如果我想配置“myFoo”的几个依赖项,那么我很乐意写:
catalog[ "myFoo" ].
.Into( "bar").Plug( "myBar" )
.Into( "some_other_member" ).Plug( "that_other_instance" );
有点不寻常的是,通常情况下,在进行配置时,您处理的类型不是实例......