В программировании для развлечения я заметил, что управление зависимостями кажется скучной работой, которую я хочу свести к минимуму. After reading this, я придумал с инжектором супер тривиальной зависимости, в результате чего экземпляры зависимостей ищутся с помощью ключа строки:Инъекция зависимостей Python для ленивых callables
def run_job(job, args, instance_keys, injected):
args.extend([injected[key] for key in instance_keys])
return job(*args)
Этот дешевый трюк работает с вызовами в моей программе всегда лениво определенной (где функция ручка хранятся отдельно от своих аргументов) в итераторе, например:
jobs_to_run = [[some_func, ("arg1", "arg2"), ("obj_key",)], [other_func,(),()]]
причина в том, что из центрального main loop
, который должен планировать все события. Он имеет ссылку на все зависимости, поэтому для инъекции "obj_key"
может быть передан в объекте ДИКТ, например:
# inside main loop
injection = {"obj_key" : injected_instance}
for (callable, with_args, and_dependencies) in jobs_to_run:
run_job(callable, with_args, and_dependencies, injection)
Так, когда произошло событие (ввод данных пользователя, и т.д.), основной цикл может вызвать update()
на конкретный объект, который реагирует на этот вход, который, в свою очередь, строит список заданий для main loop
, чтобы запланировать, когда есть ресурсы. Для меня он чист к key-reference любые зависимости для кто-то еще для инъекций, а не для того, чтобы все объекты формировали прямые отношения.
Поскольку я лениво определяю все вызовы (функции) для game clock engine to run them on its own accord, приведенный выше наивный подход работал с очень небольшой добавленной сложностью. Тем не менее, есть воровство кода в том, что нужно ссылаться на объекты по строкам. В то же время, было вонючим, чтобы проходить зависимости вокруг, и constructor or setter injection было бы излишним, как возможно, самым большим dependency injection libraries.
Для особого случая инъекционные зависимостей в вызываемых объектов, которые лениво определяется, есть ли более выразительные образцы дизайна в существовании?
Возможно, вы могли бы усовершенствовать свой текущий подход, чтобы использовать конструкцию 'kwargs', чтобы иметь именованные функциональные параметры, а затем рассматривать это как инъекционный' dict'. Таким образом, ваши исходные строки более явны в качестве параметров функции. – user268396