由于ROR已经限定了MVC的三层架构,这样也就失去了service层,在做项目的时候会吧service层的业务逻辑写在controller层的action中,从逻辑上显得很乱,如果service层的业务逻辑简单的话还可以凑合,如果太复杂的业务逻辑就会增加代码的复杂度,减弱清晰度,增加维护的难度,处于种种原因想把service层抽象出来。
我们的大体思路是在app下面创建一个服务层(例如service)的目录,然后在里面编写相应的service层的代码,把这个目录引入rails的加载路径,并且require此目录下所有的文件。
按照这个思路,创建目录和编写service层代码都不是问题,rails的加载路径是什么,并且要在加载项目文件之前放入rails的加载路径。查看boot.rb其中
def run
load_initializer
Rails::Initializer.run(:set_load_path)
end
从这段代码可以得知rails调用run的时候加载的项目路径,现在有了时机,所以可以在这个方法只有添加service层的路径。rails的加载路径的全局变量时“$:”,所以只要使用
$:.push("project_path/app/service")即可,然后再require此目录下面的所有文件
Dir.foreach("project_path/app/service") do |filename|
require filename if filename.match(/\.rb$/)
end
然后可以启动项目测试了。
最后我又查了version=2.3.5的rails源码的Initializer.rb,其中Configuration类的方法
def initialize
set_root_path!
self.frameworks = default_frameworks
self.load_paths = default_load_paths
self.load_once_paths = default_load_once_paths
self.eager_load_paths = default_eager_load_paths
self.log_path = default_log_path
self.log_level = default_log_level
self.view_path = default_view_path
self.controller_paths = default_controller_paths
self.preload_frameworks = default_preload_frameworks
self.cache_classes = default_cache_classes
self.dependency_loading = default_dependency_loading
self.whiny_nils = default_whiny_nils
self.plugins = default_plugins
self.plugin_paths = default_plugin_paths
self.plugin_locators = default_plugin_locators
self.plugin_loader = default_plugin_loader
self.database_configuration_file = default_database_configuration_file
self.routes_configuration_file = default_routes_configuration_file
self.gems = default_gems
self.i18n = default_i18n
for framework in default_frameworks
self.send("#{framework}=", Rails::OrderedOptions.new)
end
self.active_support = Rails::OrderedOptions.new
end
......
def default_load_paths
paths = []
# Add the old mock paths only if the directories exists
paths.concat(Dir["#{root_path}/test/mocks/#{environment}"]) if File.exists?("#{root_path}/test/mocks/#{environment}")
# Add the app's controller directory
paths.concat(Dir["#{root_path}/app/controllers/"])
# Followed by the standard includes.
paths.concat %w(
app
app/metal
app/models
app/controllers
app/helpers
app/services
lib
vendor
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
paths.concat builtin_directories
end
可以看到方法default_load_paths里面已经添加了app/services的路径,但是下面
File.directory?(dir) 如果存在的话即添加,这样的话就很简单了,我们直接在app下面
添加services,添加对应的service层的代码运行,当然可以了,而且路径加载以后,还做了require处理,郁闷。。。。。。。。
绕了一大圈rails已经提供了添加services层的功能。
希望像给你的项目添加service层的朋友不要像我一样走这么多弯路。
分享到:
相关推荐
《Web.Services.on.Rails》是一本专注于在Rails框架下构建Web服务的专著。Rails,作为Ruby编程语言的一个流行Web开发框架,以其简洁、高效和DRY(Don't Repeat Yourself)的原则深受开发者喜爱。Web服务则是一种允许...
服务是模块和基类的集合,可让您简单地将服务层添加到Rails应用中。 动机 有关Rails的服务层(服务对象,SOA等)的文章很多。 当然有优点也有缺点,但是自2013年以来在多个Rails应用程序中使用Services之后,我必须...
根据提供的文件信息,我们可以提炼出关于RESTful Web Services的关键知识点: RESTful Web Services概念:RESTful Web Services是一种基于Web的架构风格和设计模式,用于构建可扩展和灵活的网络应用。REST即表现层...
Amazon Web Services(AWS)的OpsWorks是云中的自动化运维服务,它提供了对基础设施和应用程序生命周期管理的精细控制。OpsWorks支持多种计算服务,如EC2实例,并且能够与Chef和 Puppet等配置管理工具集成,简化了...
- **Web Services on Rails**:专门讲解了如何使用 Rails 构建 Web 服务。 以上内容不仅覆盖了 RESTful Web Services 的基本概念和技术要点,还介绍了相关的技术书籍,有助于读者深入了解 RESTful Web Services 的...
《Ruby on Rails博客与产品组合应用详解——NISEVI》 NISEVI是一款基于Ruby on Rails框架构建的博客和产品组合应用程序。它提供了一个平台,让用户可以展示个人作品集,同时分享自己的想法和见解,体现了Rails框架...
- **Web Services on Rails**:专门讨论在 Rails 应用中集成 Web 服务的技术和实践。 此外,O'Reilly 提供了丰富的在线资源和服务,如 Safari Bookshelf 可以为程序员和 IT 专业人士提供数千本技术书籍的在线访问...
Rails的ActiveRecord层提供了ORM(对象关系映射),简化了数据库操作。 6. **消息处理和协议适配**: RCS服务需要实现IMS(IP Multimedia Subsystem)标准,可能涉及到SIP(Session Initiation Protocol)和 ...
这一步通常需要编写SQL脚本或利用ETL(Extract, Transform, Load)工具,如SSIS(SQL Server Integration Services),将ASP.NET数据库中的数据迁移到新的ROR数据库中。在处理过程中需要注意数据类型转换,因为不同...
- **REST的定义**:REST是一种针对Web应用的架构设计方式,其核心理念是基于HTTP协议操作资源,并实现数据和表现层的分离。 - **REST的特点**: - 基于HTTP的资源操作。 - 通过HTTP方法进行CRUD操作。 - 数据和...
1. **创建自定义层**:在OpsWorks中,为你的Rails应用创建一个新的自定义层,如“Sidekiq Layer”。 2. **配置启动脚本**:在新层的“初始化脚本”中,添加启动Sidekiq的命令,如`bundle exec sidekiq -C config/...
2. `app/` - AngularJS应用的主要文件夹,可能有`controllers.js`(控制层)、`services.js`(服务层,如与Rails API交互的HTTP服务)、`directives.js`(指令层,自定义DOM元素)等。 3. `views/` - HTML模板文件,...
随着对MVC模式的深入理解,你可以将其应用到更大规模的项目中,例如使用Spring MVC、ASP.NET MVC或Ruby on Rails等框架。此外,还可以探索前端MV*框架(如Angular、React或Vue.js),它们同样遵循类似的分层思想,但...
- **简介**:Grails是基于Groovy的一种快速开发框架,其设计理念深受Ruby on Rails的影响,强调约定优于配置(Convention over Configuration)的原则。 - **主要特点**: - **自动代码生成**:Grails提供了强大的...
它处理用户的输入,调用模型层的数据,并决定如何渲染视图。 #### Grails的甜点:企业级就绪 Grails支持如安全、服务整合、集群、以及企业级消息服务等企业级功能,确保它能够满足各种企业应用开发的需求。 #### ...
Grails 借鉴了Ruby on Rails的设计理念,引入了GORM(Grails Object Relational Mapping)用于数据库操作,以及一系列的插件系统,支持快速构建复杂的Web应用程序。 2. **Groovy语言基础** Grails 采用Groovy作为...
- **项目结构**:Grails应用的目录结构清晰,包括`grails-app`下的`conf`、`controllers`、`domain`、`i18n`、`services`、`taglib`、`views`等子目录,以及`lib`、`spring`、`hibernate`、`src`和`web-app`等核心...
Grails是一个基于Java平台的开源框架,它结合了Ruby on Rails的敏捷开发理念和Java的强类型、静态检查的优势,提供了一种快速开发全栈式Web应用的方式。 在**描述**中提到,该系统采用了EasyUI作为前端框架。EasyUI...