What is a design pattern? What is Repository pattern, when and how should you use it? How does it work? I try to answer these questions in this presentation
Using multiple backends/persistency solutions • Swap backends isn’t the intention! (but it makes you capable) • Complicated access rules • If testing your domain objects is too hard* * too hard to fake, stub or setup case the
@adapter end def self.adapter=(adapter) @adapter = adapter end def self.find(klass, id) adapter.find(klass, id) end def self.all(klass) adapter.all(klass) end def self.create(object) adapter.create(object) end … end
@counter = 0 @map = {} end def create(record) @counter = @counter + 1 record.id ||= @counter map_for(record)[record.id] = record 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
Repo.save(record) end def all Repo.all object_class end def find(id) Repo.find object_class, id end def delete(record) Repo.delete record end def query(selector) Repo.query object_class, selector end private def object_class @object_class ||= self.to_s.match(/^(.+)Repo/)[1].constantize end end