лучший / самый элегантный способ для обмена объектами между стеком приложений / промежуточного ПО, монтируемых в стойку? - PullRequest
7 голосов
/ 01 апреля 2011

Как лучше всего разделить объект между монтируемыми в стойку приложениями / промежуточным ПО?

Например, на этом config.ru есть два приложения Sinatra, сопоставленные с разными конечными точками:

class App1 < Sinatra::Base
  # ...
end

class App2 < Sinatra::Base
  # ...
end

map '/app1' do
  run App1
end

map '/app2' do
  run App2
end

Теперь, если этим двум приложениям необходимо совместно использовать объект, будь то соединитель базы данных или любой другойобъект, что было бы лучше для этого?

Я вижу в основном два варианта:

1- Создать константу на уровне config.ru и просто ссылаться на эту константу в приложениях.Например:

SHARED_OBJECT = "hello world"

class App1 < Sinatra::Base
  get '/' do
    SHARED_OBJECT
  end
end

class App2 < Sinatra::Base
  get '/' do
    SHARED_OBJECT
  end
end

map '/app1' do
  run App1
end

map '/app2' do
  run App2
end

2 - Создайте одноэлементный объект на уровне config.ru и используйте его в приложениях.Например:

class SharedObject
  include Singleton

  def test
    @test ||= "hello world"
  end
end

class App1 < Sinatra::Base
  get '/' do
    SharedObject.instance.test
  end
end

class App2 < Sinatra::Base
  get '/' do
    SharedObject.instance.test
  end
end

map '/app1' do
  run App1
end

map '/app2' do
  run App2
end

Комментарии / предложения?
Колин

1 Ответ

5 голосов
/ 06 апреля 2011

Я бы переместил общий объект в отдельный файл и поместил бы его в пространство имен.Если бы это был объект подключения к базе данных, он мог бы выглядеть следующим образом:

# config.ru:
require 'lib/my_app/database'
...
class App1 < Sinatra::Base
  get '/' do
    MyApp::Database.with_connection do |conn|
      ...
    end
  end
end

# lib/my_app/database:
module MyApp
  module Database
    def self.with_connection(&block)
      ...
    end
  end
end

Я вижу в этом несколько преимуществ:

  1. уменьшает размер вашего файла config.ru* улучшая читаемость
  2. это разделяет проблемы - config.ru касается приложений в стойке;lib/my_app/database.rb о базах данных
  3. облегчает извлечение.В какой-то момент вы можете разделить App1 и App2 на отдельные проекты и включить подключение к базе данных в качестве драгоценного камня.Это легко сделать, если код базы данных находится в своем собственном модуле и файле. Комментарий

Phrogz о том, что констант достаточно и им не нужны одиночные символы, является мудрым.

...