模块化、基于组件的 Sinatra 应用程序的架构

2024-03-16

我正在开发一个 Sinatra 应用程序,其中包含大约 10 个不同的功能组件。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全通过 config.yaml 文件进行配置,如下所示:

components:

- route: '/chunky'
  component_type: FoodLister
  component_settings: 
    food_type: bacon
    max_items: 400

- route: 'places/paris'
  component_type: Mapper
  component_settings: 
    latitude: 48.85387273165654
    longitude: 2.340087890625  

- route: 'places/losangeles'
  component_type: Mapper
  component_settings:
    latitude: 34.043556504127466
    longitude: -118.23486328125

正如您所看到的,组件可以多次实例化,每个组件都有自己的上下文设置。

每个组件至少包含一个路由,其中​​配置文件中的“route”属性用于基础组件。

组织和实例化模块代码的最佳方法是什么?


这与 include 的提议类似,但它不需要访问rackup 文件。

编写您的各种处理程序,例如:

class FoodHandler < Sinatra::Base
  get '/chunky/:food' do
    "Chunky #{params[:food]}!"
  end
end

然后在您的主应用程序文件中:

require './lib/handlers/food_handler.rb'

class Main < Sinatra::Base
  enable :sessions
  ... bla bla bla
  use FoodHandler
end

我已经使用这种结构来构建一些相当复杂的 Sinatra 应用程序。它的扩展性与 Rails 一样好。

EDIT

要让配置文件定义路由,您可以执行以下操作:

class PlacesHandler < Sinatra::Base
  # Given your example, this would define 'places/paris' and 'places/losangeles'
  CONFIG['components'].select { |c| c['compontent_type'] == 'Mapper' }.each do |c|
    get c['route'] do
      @latitude = c['component_settings']['latitude']
      @longitude = c['component_settings']['longitude']
    end
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模块化、基于组件的 Sinatra 应用程序的架构 的相关文章

随机推荐