Мне было интересно несколько способов добиться абстрагирования доступа к хранилищу данных от основного приложения и небольшого примера, структура IoC кажется излишней, возможно, передача объекта через параметр конструктора (фасад).
является ли ниже псевдокод хорошим способом делать что-то и как я могу заполнить недостающие части с помощью python?
main.py
resp = Repository(engine=NoSql) # can easily switch to nosql???
resp.save("hello");
resp.select("hello");
repository.py
class Repository:
def __init__(self, engine):
self.engine = engine
def save(self, str)
engine.save(str)
def select(self, str)
engine.select(str)
nosql.py
class NoSql:
def save(self, str)
nosql.save(str)
def select(self, str)
nosql.select(str)
mysql.py
class MySql:
def save(self, str)
mysql.save(str)
def select(self, str)
mysql.select(str)
Я бы сказал, что это не отличный способ. Потребитель (в данном случае main.py
) не должен знать ничего о деталях реализации модели. То, что я могу сделать, это хранить пары ключ/значение во внешнем файле конфигурации, который будет использоваться моделью для определения используемого движка.
Вы собираетесь создать еще один слой ORM.
Вместо того, чтобы тратить много времени на изобретательство этого колеса, узнать о существующих ORM и адаптировать его к вашему движку базы данных noSQL.
Начните, например, с SQLAlchemy как ORM, который может выполнять все то, что вы хотите (и многое другое) для SQL.
Из-за написания утиной Python вы можете придумать совместимый ORS ORM ORS или ORS-репозиторий или что-нибудь еще, что вы считаете важным.
Однако не изобретайте это колесо с нуля. Прочтите несколько других реализаций. SQLObject, Django ORM, SQLAlchemy - хорошие места для начала.
Это практичное решение, я сделал аналогичные вещи в других проектах. Убедитесь, что вы сохраняете всю реализацию базы данных в классах базы данных. main должен иметь возможность переключаться между ними без каких-либо изменений. Если вам нужно внести изменения в main при переключении, это, вероятно, код, который должен быть в классах Sql.
Я бы сделал Repository базовым классом, из которого получаются другие, а не с оберткой. Таким образом, если две реализации имеют идентичный или очень похожий код, вы можете перемещать части в репозиторий, чтобы не дублировать его.
self
в каждом методе ...