我正在使用 MongoDB 作为我的项目的后端,但我并不特别希望在项目的生命周期中依赖 Mongo,以防我以后决定更改它,或者如果没有数据库的情况下单元测试更容易。然而,正如所写,我的控制器严格依赖于 MongoDB。
主要取自MongoDB 教程,我在一个config/initializers/mongo.rb
文件中有以下内容。
MongoMapper.connection = Mongo::Connection.new('localhost')
MongoMapper.database = 'database'
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
MongoMapper.connection.connect if forked
end
end
在用于查询美国各州的控制器中,我有以下代码:
class StateController < ApplicationController
def index
states = MongoMapper.connection.db('database').collection('state').find()
render :json => states
end
end
我马上就看到了一些问题(可能还有更多):
- 如前所述,控制器对 MongoDB 有硬依赖。
- 我没有使用
database
MongoMapper 类的属性(它在控制器中硬编码)。 - 每次我想要引用状态集合时,我不一定要通过 HTTP 端点——尽管我想保持这个选项可用。例如,如果注册页面有一个下拉列表供用户选择他们的家庭状态,那么要求客户端 jQuery.get() 填充状态列表似乎是愚蠢的。在我看来,在服务器端预先获取状态并在服务器上构建下拉列表会更有意义。
对于#3,我当然可以在任何呈现需要状态列表的视图的操作方法中查询状态并将它们保存在@states(或类似的东西)中,但这将是很多重复的代码。
构建它以减少耦合和更多代码重用的最佳方法是什么?