Qual é a diferença entre um utilitário zope definido com uma fábrica versus um componente?

StackOverflow https://stackoverflow.com/questions/2135316

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top