我是一个实现依赖注入(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
    

    好吧,我对这个比喻不太满意,因为:
  • 在现实世界中,您将插头插入套接字,因此源类应具有一个插头,目标类应具有一个套接字,但是在“代码世界”中,我有一个指向另一个类的类的指针;
  • 当您与基数> 1关联时,我的隐喻不能很好地工作。我尝试了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" );
        ...
    }
    

    最佳答案

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

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

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

    08-26 14:33