Ruby Lotus 与 Clean Architecture

chenge · 2015年09月04日 · 最后由 chenge 回复于 2015年09月04日 · 2085 次阅读

Rails 引入 Lotus model 遇到的问题

启动后正常,每次修改了 Ruby 代码会导致报错,重启服务器就好了。

Lotus::Model::Adapters::NoAdapterError in PostsController#edit
Cannot invoke `find' without selecting an adapter. Please check your framework configuration.

rails 如何做到改代码不用启动服务器的呢?不知道可有解决办法?请教各位。

Lotus 简单介绍

最近开始学习 Lotus 框架,文档中提到 Lotus 的设计思路来自 Clean Architecture,如下图所示:

可以看到 Entity(相当于 Rails model)居于核心,DB 在外围,Repository 作为数据中介。采用的是松耦合结构。Rails 中 model、db、view 是强耦合的。

架构:The Clean Architecture(整洁的架构)(转载)

引入 Lotus 的两种方式

  • 独立模式:完全采用 Lotus
  • 混合模式:Rails + Lotus model

独立模式

我学习了入门课,因为了解有限,留待以后再探讨了。

混合模式

由于 Lotus 是模块化的,所以我想到了在 Rails 中引入 Lotus model,这样学习成本比较低。 可以有效利用现有的 Rails 资源。

试验还比较顺利:

* 只是 form_for 不能用了,form_tag 可以用。

  • form_for 的参数要改用:post
  • helper 的部分参数不支持,例如:posts_path(@post) 需要改为 posts_path(@post.id)

示例代码如下:

# Entity

class Post
    include Lotus::Entity
    attributes :title, :body, :created_at, :updated_at
end

# Controller

def create
    @post = Post.new(params)
    @post.created_at = @post.updated_at = Time.now
    PostRepository.create(@post)
    redirect_to posts_path, notice: 'Post was successfully created.'
end

混合模式的优点

  • Entity 更符合 SRP 单一职责原则。很容易切换数据源。
  • Entity 测试完全简化了,可作为每日例行测试,数据库测试可以作为集成测试。

最后

有兴趣用 Lotus 么?欢迎加入探讨。

可以在 Rails 中使用 Lotus model,是不是说明 Rails 是松耦合,模块化做得好?

#1 楼 @rei 就框架整体而言,是考虑了扩展的,还是可以的。

model 与数据库是强耦合的 view 也依赖 model,form_for 就不能用。

#2 楼 @chenge form_for 脱离 model 也能用:

<%= form_for :book, url: books_path do |f| %>
  <%= f.text_field :name %>
  <%= f.submit 'Submit' %>
<% end %>

#3 楼 @rei 谢谢,确实可以这样改。

真到正式项目,我还是选 Rails

#5 楼 @lidashuang 这个要看项目的规模吧,超过某个规模,比如 model 数目达到几十个,或更高的时候,Lotus 就有优势了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号