Dan*_*lli 6 c++ oop dependency-injection ioc-container
我是一个实现依赖注入的小型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
Run Code Online (Sandbox Code Playgroud)
好吧,我对这个比喻不太满意,因为:
MultiplePlug< T >(基本上是a std::list< Plug< T > >),但听起来不太好:现实世界中的"多重插头"是什么?在这里你可以找到我的图书馆.你对一个更适合我的代码的比喻有什么建议吗?
(不过,如果您对图书馆有任何其他好的建议,欢迎他们!)
非常感谢你.
注意:我知道还有另一个问题主题是"什么是依赖注入的一个很好的比喻",但这不是它的重复.
编辑:这是一篇关于着名博客文章评论中的主题的讨论.
Edit2:最后,我决定将语法更改为更好更简单的语法:
// explicit catalog
use( myCatalog["myBar"] ).as( "bar" ).of( myCatalog["myFoo"] );
// implicit catalog:
within( myCatalog )
{
use( "myBar" ).as( "bar" ).of( "myFoo" );
...
}
Run Code Online (Sandbox Code Playgroud)
我认为这是配置阶段。如果您坚持使用Plug和Into术语:
// this means myFoo.bar = myBar
catalog[ "myFoo" ].Into( "bar" ).Plug( catalog[ "myBar" ] );
Run Code Online (Sandbox Code Playgroud)
wherePlug用作动词,即“插入”。如果您要创建流畅的界面,请尝试制定有意义的句子。如果我想配置“myFoo”的多个依赖项,那么我很乐意写:
catalog[ "myFoo" ].
.Into( "bar").Plug( "myBar" )
.Into( "some_other_member" ).Plug( "that_other_instance" );
Run Code Online (Sandbox Code Playgroud)
有点不寻常的是,通常,在进行配置时,您处理的是类型而不是实例......