Dependency injection 使用RequireJs的依赖项注入或服务位置

Dependency injection 使用RequireJs的依赖项注入或服务位置,dependency-injection,coffeescript,requirejs,jasmine,service-locator,Dependency Injection,Coffeescript,Requirejs,Jasmine,Service Locator,我有点困惑我应该如何用RequireJs实例化我的对象。我正在使用coffeescript类,它将所有对象定义为类型化函数?(不确定术语是否正确) 目前,我正在为自己的对象使用依赖项注入,下面是一个示例viewModel和服务 我通过一个选项数组将服务注入构造函数中的视图模型 define 'myViewModel', [ 'jquery', 'sammy' ], ( $, sammy ) -> class myViewModel constructor: ( options

我有点困惑我应该如何用RequireJs实例化我的对象。我正在使用coffeescript类,它将所有对象定义为类型化函数?(不确定术语是否正确)

目前,我正在为自己的对象使用依赖项注入,下面是一个示例viewModel和服务

我通过一个选项数组将服务注入构造函数中的视图模型

define 'myViewModel', [ 'jquery', 'sammy' ], ( $, sammy ) ->
  class myViewModel
    constructor: ( options ) ->
      self = @
      @service = options.service

      @router = sammy( -> 
        @get( '/SomeRoute#:id', self.onHashUpdated )
      )
      @router.run()
在这里,我将alertId注入到服务中

define 'myService', ['baseService'], ( baseService ) ->
  class myService extends baseService
    constructor: ( options ) ->
      @alertId = options.alertId
      super()    
这是我的高级页面对象。我进行视图模型实例化,并将所有必需的依赖项注入视图模型

require [ 'myViewModel', 'myService', 'domReady!' ], ( viewModel, service ) ->
  myViewModelInstance = new viewModel
    service: new service
      alertId: 'some-alert-id'
我只是不确定我是应该这样做,还是应该从服务定义返回一个新的服务,使其成为一个单例

所有其他依赖项,如
jquery
sammy
knockout
都是这样工作的,并从
require
返回工作对象,而不是像我的对象那样需要实例化的类型

使用requireJs是否有公认的模式

我应该做依赖注入还是服务定位


这将导致测试javascript并找到一个库,该库可以覆盖requireJs并返回模拟对象,而不是真正的依赖项

在《茉莉花》中,我可能会有这样的东西

describe '=== my view model ===', ->
  sut = null

  beforeEach ->
    require ['myViewModel', 'mockService'], ( viewModel, mockService ) ->
      sut = new viewModel
        service: new mockService
我试过了,但是文档非常糟糕,而且没有任何完整的例子说明如何使用它


看起来这种事情也有可能发生?

我选择了以下内容,让每个对象实例化它自己的依赖项

define 'myService', ['baseService', 'alert'], ( baseService, alert ) ->
  class myService extends baseService
    constructor: ( options ) ->
      super()
      @alertId = new alert
然后在测试模块时使用squire js注入sinon js Mock