コンポーネント対工場で定義されたZopeのユーティリティの違いは何ですか?

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

質問

これは、ZopeのユーティリティのZCML登録はコンポーネントや工場を受け入れることができる混乱少しです。

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

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

の違いは何ですか?

役に立ちましたか?

解決

成分として登録ユーティリティがインスタンスである

工場は、のユーティリティを作成します。あなたはコンポーネントとして登録されたユーティリティを見ればそのため、あなたは同じオブジェクトのバックを毎回取得します。それは工場として登録されていますしかし、もし、あなたが毎回新しいインスタンスを取得します。

他のヒント

私は、@レナート・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です

これのどれもあなたにそれがためではなく、わずかに異なるAPIを尋ねたたびに新しいインスタンスを提供することができます何かを提供しているIFactoryですと混同されるべきではありません。 それらの詳細については、この資料ます。

を参照してください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top