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

时间:2013-07-01 11:10:36

标签: dependency-injection coffeescript requirejs jasmine service-locator

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

目前我正在为我自己的对象使用依赖注入,这里是一个示例viewModel和service

我通过选项数组

将我的服务注入到构造函数的视图模型中
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'

我只是不确定这是我应该怎么做的,或者我是否应该从服务定义中返回一个新服务,使其成为单身人士。

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

使用requireJs是否有可接受的模式?

我应该进行依赖注入还是服务定位?


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

在Jasmine我可能有类似的东西

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

  beforeEach ->
    require ['myViewModel', 'mockService'], ( viewModel, mockService ) ->
      sut = new viewModel
        service: new mockService

我尝试了testr,但文档很糟糕,并没有任何关于如何使用它的完整示例。

对于这种事情,

SquireJs看起来也是可能的吗?

1 个答案:

答案 0 :(得分:0)

我已经完成了以下操作,让每个对象实例化它自己的依赖项

define 'myService', ['baseService', 'alert'], ( baseService, alert ) ->
  class myService extends baseService
    constructor: ( options ) ->
      super()
      @alertId = new alert

然后在我测试模块时使用squire js注入sinon js模拟。