wirejs - 每个依赖组件的新组件实例

时间:2014-01-21 17:55:53

标签: javascript inversion-of-control ioc-container wirejs

首先:我是新的wirejs,我很可能错过了文档上的内容

在常规组件声明中,例如:

'Bnaya/App/TrackingService': {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: []
    }
}

使用$ ref依赖于该组件的所有组件将获得相同的实例,因此连线也将是一种单独机制(在大多数情况下这对我有好处)

在某些情况下,我希望每个依赖项都会使用相同的组件配置获得自己的组件实例。

'Bnaya/App/TrackingService': {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: [],
        notASingleton: true
    }
}

我知道如何使用多个组件名称或内联创建实例来获得类似的结果,但这是我想要避免的。

谢谢!

1 个答案:

答案 0 :(得分:3)

有两种方法可以在wire.js中创建多个组件实例。根据您的需求,您可以看到哪一个可能适合您。

首先,您可以使用create工厂从原型中获取新实例。当你给create一个函数或构造函数模块时,它会调用它们。但是,如果您为create提供现有对象,则会使用Object.create来生成新实例,然后您可以照常进一步配置(例如使用propertiesinit ,建议等)。请记住,它的工作方式与Object.create完全相同,因此将共享原型属性。

其次,你可以使用wire factory来达到你所追求的效果。您只需要将非单例包装在自己的线规范中。这是一个简单的例子:

thingThatNeedsATrackingService: {
    create: 'my/ThingThatNeedsATrackingService',
    properties: {
        foo: { wire: 'my/trackingServiceSpec' }
    }
},

otherThingThatNeedsATrackingService: {
    create: 'my/OtherThingThatNeedsATrackingService',
    properties: {
        foo: { wire: 'my/trackingServiceSpec' }
    }
},
//... more components

然后,在my/trackingService.js

// Export the trackingService instance
$exports: { $ref: 'trackingService' },

trackingService: {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: []
    }
},
//... more components if you need

这会将Bnaya/App/TrackingService的新实例注入到需要一个的两个事物中。 $exports允许您从线规中导出特定组件,就像CommonJS exports一样。

这种方法有一些很好的好处,你可以在里面配置“私有”组件 my/trackingService.js并且还会根据需要创建它们,但只有trackingService可见。在缺点方面,将这样的原型组件分成自己的线规有时需要做更多的工作。

即将推出的wire.js版本将支持其他类型的组件范围,因此可以使某些情况更容易。