领域驱动设计中,也就是 Domain Driven Development, 简称 DDD 的一种设计方法,Repository 是一个重要的支撑模式。
这个代码演示了内存方式,很简单,是用 hash 来模拟的。
class InMemoryBackend
def initialize
@counter = 0
@map = {}
end
def create(record)
@counter = @counter + 1
record.id ||= @counter
map_for(record)[record.id] = record
end
def update(record)
map_for(record)[record.id] = record
end
def delete(record)
map_for(record).delete record.id
end
def find(klass, id)
map_for_class(klass).fetch id
end
def all(klass)
map_for_class(klass).values
end
def query(klass, selector)
send "query_#{selector.class.name.underscore}", selector
end
private
def map_for_class(klass)
@map[klass.to_s.to_sym] ||= {}
end
def map_for(record)
map_for_class(record.class)
end
end
接下来,可以用 User 来实验
class User
attr_accessor :id, :name
end
db = InMemoryBackend.new
user = User.new
user.id = 1
user.name = 'Bill'
db.create(user)
db.find(User, 1)
文章中有比较完整的介绍,英文链接
作者 Hawkins 写了很多不错的博客,值得一读。