Qual é a diferença entre um utilitário zope definido com uma fábrica versus um componente?
-
22-09-2019 - |
Pergunta
É um pouco confuso que os registros ZCML para utilitários de zope possam aceitar um componente ou uma fábrica.
<utility component=".some.Class" />
contra
<utility factory=".some.Factory" />
Qual é a diferença?
Solução
Uma fábrica cria Os utilitários, enquanto um utilitário registrado como componente é uma instância. Portanto, se você procurar um utilitário registrado como um componente, receberá o mesmo objeto de volta toda vez. Mas se estiver registrado como fábrica, você receberá uma nova instância sempre.
Outras dicas
Eu acho que a resposta de @Lennart-Regebro pode ser um pouco involuntariamente enganosa. É compreensível, pois os documentos de zope são um pouco vagos. Acho que abaixo está a interpretação correta, mas eu tive que testá -la para ter certeza.
Dentro tanto o componente quanto a fábrica cadastro cada chamada subsequente Para obter, após um registro inicial, retornará o mesma instância.
A diferença é que o método do componente registrará o objeto referenciado como a instância do utilitário a ser retornado, onde, como o método da fábrica, chamará o objeto referenciado e armazenará o resultado como a instância do utilitário a ser retornada.
Exemplo de fábrica
Por exemplo, se você tiver uma classe de utilitário definida como assim;
class MyUtility(object):
implements(IMyUtility)
...
registrando -o com; <utility factory=".my_module.MyUtility"/>
No momento, o ZCML é executado criar uma instância de miutilidade e armazená -la para quaisquer chamadas futuras para o Getutility;
> a = getUtility(IMyUtility)
> b = getUtility(IMyUtility)
> c = getUtility(IMyUtility)
> a is b is c
True
Observe que poderíamos ter registrado a fábrica para ser uma função em vez de uma classe, apenas precisa ser algo que, quando chamado sem argumentos, retorna a instância do seu utilitário que você deseja usar.
Exemplo de componente
Um exemplo equivalente com o componente é;
class MyUtility(object):
implements(IMyUtility)
...
my_module_instance_of_utility = MyUtility()
registrando -o com; <utility component=".my_module.my_module_instance_of_utility"\>
Isso é mais ou menos equivalente ao exemplo da fábrica. A única diferença é que a instância retornada no exemplo do componente é instanciada quando my_module
é importado por qualquer coisa (incluindo o mecanismo de registro), onde, ao usar uma fábrica, a instância é instanciada quando a configuração ZCML é executada, pouco antes de ser registrada. Nos dois casos, as chamadas subsequentes para o Getutility retornarão a mesma instância.
Não ser confundido com o ifActory
Nada disso deve ser confundido com o IfActory, que fornece algo que pode fornecer uma nova instância cada vez que é solicitada, mas com uma API ligeiramente diferente. Ver este documento para obter mais informações sobre aqueles.