Advanced Design Patterns
Repository, unit of work, and enterprise patterns.
Overview
Master enterprise design patterns.
Repository Pattern
from abc import ABC, abstractmethod
class UserRepository(ABC):
@abstractmethod
def find_by_id(self, user_id):
pass
@abstractmethod
def find_by_email(self, email):
pass
@abstractmethod
def save(self, user):
pass
class SQLUserRepository(UserRepository):
def __init__(self, session):
self.session = session
def find_by_id(self, user_id):
return self.session.query(User).get(user_id)
def find_by_email(self, email):
return self.session.query(User).filter_by(email=email).first()
def save(self, user):
self.session.add(user)
self.session.commit()
Unit of Work
class UnitOfWork:
def __init__(self, session):
self.session = session
self.new_objects = []
self.dirty_objects = []
self.deleted_objects = []
def register_new(self, obj):
self.new_objects.append(obj)
def register_dirty(self, obj):
self.dirty_objects.append(obj)
def register_deleted(self, obj):
self.deleted_objects.append(obj)
def commit(self):
for obj in self.new_objects:
self.session.add(obj)
for obj in self.dirty_objects:
self.session.merge(obj)
for obj in self.deleted_objects:
self.session.delete(obj)
self.session.commit()
Practice
Implement a service layer using repository pattern.