我是一个实现依赖注入的小型 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
好吧,我对这个比喻不太满意,因为:
- 在现实世界中,您将插头插入插座,因此源类应该有一个插头,目标类应该有一个插座,但在“代码世界”中,我有一个指向另一个类的类的指针;
- 当您与基数 > 1 关联时,我的比喻效果不佳。我尝试使用 a
MultiplePlug< T >
(它基本上是 astd::list< Plug< T > >
),但听起来不太好:现实世界中的“multipleplug”是什么?
在这里你可以找到我的图书馆。您对更适合我的代码的隐喻有什么建议吗?
(不过,如果您对图书馆有任何其他好的建议,欢迎他们!)
非常感谢。
注意:我知道主题“什么是依赖注入的好比喻”还有另一个问题,但这不是它的重复。
编辑:这是一篇著名博客文章的评论中关于该主题的讨论。
Edit2:最后,我决定将语法更改为这种更好更简单的语法:
// explicit catalog
use( myCatalog["myBar"] ).as( "bar" ).of( myCatalog["myFoo"] );
// implicit catalog:
within( myCatalog )
{
use( "myBar" ).as( "bar" ).of( "myFoo" );
...
}