В чем разница между утилитой Zope, определенной на фабрике, и компонентом? - PullRequest
2 голосов
/ 25 января 2010

Немного странно, что для регистрации ZCML для утилит Zope можно принять компонент или фабрику.

<utility component=".some.Class" />

против

<utility factory=".some.Factory" />

В чем разница?

Ответы [ 2 ]

3 голосов
/ 15 октября 2013

Я думаю, ответ @ lennart-regebro может быть немного неумышленно обманчивым. Это понятно, поскольку документы Zope немного расплывчаты. Я думаю, что ниже приведена правильная интерпретация, но я должен был проверить ее сам, чтобы убедиться.

В и компонент, и фабрика регистрация каждый последующий вызов getUtility после начальной регистрации вернет тот же экземпляр .

Разница в том, что метод компонента зарегистрирует ссылочный объект в качестве экземпляра утилиты, который будет возвращен, тогда как фабричный метод вызовет ссылочный объект и сохранит результат в качестве экземпляра утилиты, который будет возвращен.

Пример фабрики

Так, например, если у вас есть служебный класс, определенный следующим образом:

class MyUtility(object):
    implements(IMyUtility)
    ...

регистрация его с помощью; <utility factory=".my_module.MyUtility"/>

в момент выполнения zcml создаст экземпляр MyUtility и сохранит его для любых будущих вызовов getUtility;

> a = getUtility(IMyUtility)
> b = getUtility(IMyUtility)
> c = getUtility(IMyUtility)
> a is b is c
True

Обратите внимание, что мы могли бы зарегистрировать фабрику как функцию вместо класса, просто она должна быть чем-то, что при вызове без аргументов возвращает экземпляр вашей утилиты, которую вы хотите использовать.

Пример компонента

Эквивалентный пример с компонентом:

class MyUtility(object):
    implements(IMyUtility)
    ...

my_module_instance_of_utility = MyUtility()

регистрация его с помощью; <utility component=".my_module.my_module_instance_of_utility"\>

Это более или менее эквивалентно заводскому примеру. Единственное отличие состоит в том, что экземпляр, возвращенный в примере компонента, создается, когда my_module импортируется чем-либо (включая механизм регистрации), тогда как при использовании фабрики экземпляр создается при выполнении конфигурации zcml, непосредственно перед тем, как он зарегистрирован , В обоих случаях последующие вызовы getUtility будут возвращать один и тот же экземпляр.

Не путать с IFactory

Ничего из этого не следует путать с IFactory, который предоставляет что-то, что может предоставлять вам новый экземпляр каждый раз, когда его запрашивают, но с немного другим API. См. этот документ для получения дополнительной информации о тех .

2 голосов
/ 25 января 2010

Фабрика создает утилиты, а утилита, зарегистрированная как компонент, является экземпляром. Следовательно, если вы посмотрите утилиту, зарегистрированную как компонент, вы будете возвращать один и тот же объект каждый раз. Но если он зарегистрирован как фабрика, вы будете получать новый экземпляр каждый раз.

...