什么是依赖注入库的正确隐喻?

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)

好吧,我对这个比喻不太满意,因为:

  • 在现实世界中,您将插件插入套接字,因此源类应该有一个插件,目标类应该是一个套接字,但在"代码世界"中,我有一个指向另一个类的类的指针;
  • 当你与基数> 1的关联时,我的隐喻效果不好.我试过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)

Pau*_*lik 2

我认为这是配置阶段。如果您坚持使用PlugInto术语:

// 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)

有点不寻常的是,通常,在进行配置时,您处理的是类型而不是实例......