我是一个实现依赖注入(inject)的小型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 > >
),但听起来不太好:在现实世界中什么是“multipleplug”? Here,您可以找到我的图书馆。
您是否有建议使用适合我的代码的隐喻?
(不过,如果您对图书馆有其他建议,欢迎您!)
非常感谢你。
请注意:我知道还有一个主题“依赖注入(inject)的好隐喻是什么”的问题,但这不是重复的问题。
编辑:This是著名博客文章的评论中关于该主题的讨论。
Edit2 :最后,我决定将语法更改为更好,更简单的语法:
// explicit catalog
use( myCatalog["myBar"] ).as( "bar" ).of( myCatalog["myFoo"] );
// implicit catalog:
within( myCatalog )
{
use( "myBar" ).as( "bar" ).of( "myFoo" );
...
}
最佳答案
我认为这是在配置阶段。如果您坚持使用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" );
有点不寻常的是,通常,在进行配置时,您正在处理类型而不是实例...