Внедрение зависимостей или расположение службы с помощью RequireJs

Я немного смущен тем, как я должен создавать экземпляры своих объектов с помощью 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

Я попробовал testr, но документация ужасна, и на самом деле нет полных примеров того, как его использовать. .

SquireJs тоже подходит для такого рода вещей?


person Neil    schedule 01.07.2013    source источник


Ответы (1)


Я пошел на следующее: каждый объект создает свои собственные зависимости

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

Затем с помощью sqquire js для инъекций sinon js mocks, когда я тестирую модули.

person Neil    schedule 17.07.2013