`
icekiller110
  • 浏览: 72486 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于rails的services层

阅读更多
    由于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层的朋友不要像我一样走这么多弯路。
  • initializer.rar (10.3 KB)
  • 描述: rails的Initializer.rb源码
  • 下载次数: 4
分享到:
评论

相关推荐

    Web.Services.on.Rails.

    《Web.Services.on.Rails》是一本专注于在Rails框架下构建Web服务的专著。Rails,作为Ruby编程语言的一个流行Web开发框架,以其简洁、高效和DRY(Don't Repeat Yourself)的原则深受开发者喜爱。Web服务则是一种允许...

    服务:Rails应用程序的漂亮服务层

    服务是模块和基类的集合,可让您简单地将服务层添加到Rails应用中。 动机 有关Rails的服务层(服务对象,SOA等)的文章很多。 当然有优点也有缺点,但是自2013年以来在多个Rails应用程序中使用Services之后,我必须...

    RESTful Web Services 中文版 高清 PDF 电子书

    根据提供的文件信息,我们可以提炼出关于RESTful Web Services的关键知识点: RESTful Web Services概念:RESTful Web Services是一种基于Web的架构风格和设计模式,用于构建可扩展和灵活的网络应用。REST即表现层...

    Rails应用程序样本AWSOpsWorksRailsDemoApp.zip

    Amazon Web Services(AWS)的OpsWorks是云中的自动化运维服务,它提供了对基础设施和应用程序生命周期管理的精细控制。OpsWorks支持多种计算服务,如EC2实例,并且能够与Chef和 Puppet等配置管理工具集成,简化了...

    Rest Webservice(英)

    - **Web Services on Rails**:专门讲解了如何使用 Rails 构建 Web 服务。 以上内容不仅覆盖了 RESTful Web Services 的基本概念和技术要点,还介绍了相关的技术书籍,有助于读者深入了解 RESTful Web Services 的...

    nisevi-backend:Ruby on Rails博客和产品组合

    《Ruby on Rails博客与产品组合应用详解——NISEVI》 NISEVI是一款基于Ruby on Rails框架构建的博客和产品组合应用程序。它提供了一个平台,让用户可以展示个人作品集,同时分享自己的想法和见解,体现了Rails框架...

    Restful webservice

    - **Web Services on Rails**:专门讨论在 Rails 应用中集成 Web 服务的技术和实践。 此外,O'Reilly 提供了丰富的在线资源和服务,如 Safari Bookshelf 可以为程序员和 IT 专业人士提供数千本技术书籍的在线访问...

    RCS后端常用组件_Ruby_下载.zip

    Rails的ActiveRecord层提供了ORM(对象关系映射),简化了数据库操作。 6. **消息处理和协议适配**: RCS服务需要实现IMS(IP Multimedia Subsystem)标准,可能涉及到SIP(Session Initiation Protocol)和 ...

    ASP.NET项目移植ROR实践----DB转移(已完成)

    这一步通常需要编写SQL脚本或利用ETL(Extract, Transform, Load)工具,如SSIS(SQL Server Integration Services),将ASP.NET数据库中的数据迁移到新的ROR数据库中。在处理过程中需要注意数据类型转换,因为不同...

    RESTful Web Service 课件下载.pdf

    - **REST的定义**:REST是一种针对Web应用的架构设计方式,其核心理念是基于HTTP协议操作资源,并实现数据和表现层的分离。 - **REST的特点**: - 基于HTTP的资源操作。 - 通过HTTP方法进行CRUD操作。 - 数据和...

    opsworks_sidekiq:在opsworks上设置sidekiq

    1. **创建自定义层**:在OpsWorks中,为你的Rails应用创建一个新的自定义层,如“Sidekiq Layer”。 2. **配置启动脚本**:在新层的“初始化脚本”中,添加启动Sidekiq的命令,如`bundle exec sidekiq -C config/...

    rila-angular:前端注册 Ringelnatzlauf

    2. `app/` - AngularJS应用的主要文件夹,可能有`controllers.js`(控制层)、`services.js`(服务层,如与Rails API交互的HTTP服务)、`directives.js`(指令层,自定义DOM元素)等。 3. `views/` - HTML模板文件,...

    mvc小项目实例

    随着对MVC模式的深入理解,你可以将其应用到更大规模的项目中,例如使用Spring MVC、ASP.NET MVC或Ruby on Rails等框架。此外,还可以探索前端MV*框架(如Angular、React或Vue.js),它们同样遵循类似的分层思想,但...

    Grails in Action

    - **简介**:Grails是基于Groovy的一种快速开发框架,其设计理念深受Ruby on Rails的影响,强调约定优于配置(Convention over Configuration)的原则。 - **主要特点**: - **自动代码生成**:Grails提供了强大的...

    grails和groovy的电子书-4

    它处理用户的输入,调用模型层的数据,并决定如何渲染视图。 #### Grails的甜点:企业级就绪 Grails支持如安全、服务整合、集群、以及企业级消息服务等企业级功能,确保它能够满足各种企业应用开发的需求。 #### ...

    grails-2.4.4.zip

    Grails 借鉴了Ruby on Rails的设计理念,引入了GORM(Grails Object Relational Mapping)用于数据库操作,以及一系列的插件系统,支持快速构建复杂的Web应用程序。 2. **Groovy语言基础** Grails 采用Groovy作为...

    J1_2006_Grails_PowerPoint_v1.ppt

    - **项目结构**:Grails应用的目录结构清晰,包括`grails-app`下的`conf`、`controllers`、`domain`、`i18n`、`services`、`taglib`、`views`等子目录,以及`lib`、`spring`、`hibernate`、`src`和`web-app`等核心...

    基于grails开发的财政项目

    Grails是一个基于Java平台的开源框架,它结合了Ruby on Rails的敏捷开发理念和Java的强类型、静态检查的优势,提供了一种快速开发全栈式Web应用的方式。 在**描述**中提到,该系统采用了EasyUI作为前端框架。EasyUI...

Global site tag (gtag.js) - Google Analytics