[PEAK] Offering Named Services with configuration keys

Phillip J. Eby pje at telecommunity.com
Wed May 18 20:43:26 EDT 2005


At 12:31 AM 5/19/2005 +0000, Tiago Cogumbreiro wrote:
>Is it possible to offer a [Named Services] as something?
>
>right now I am obligated to recriate all my components available in
>the service area (created by [Component Factories]) because I can't
>offer a database as a ISQLConnection.
>
>Example follows:
>
>--myapp.ini---
>
>[Named Services]
>myapp.db = naming.LinkRef('sqlite:myapp.db')
>
>[Component Factories]
>myapp.model.SomeDM = "myapp.storage.SomeDM"
>
>--myapp-example.py--
># Problem:
># I need to offer to my DM's a ISQLConnection
># The PropertyName("myapp.db") should be offered as an storage.ISQLConnection
># Because I can't I have to recriate all the components and offer them again:
>MyBaseComponet (binding.Component):
>     # Override the DM so that further calls get this component instead
>     SomeDM = binding.Make (myapp.model.SomeDM, offerAs=[myapp.model.SomeDM]
>     # Override the DB property so that it offers a ISQLConnection:
>     db = binding.Obtain (PropertyName("myapp.db"),
>offerAs=[storage.ISQLConnection])

I don't understand.  Are you saying that SomeDM relies on a generic 
ISQLConnection?  That sounds wrong to me.  Surely it requires something 
more specific than just any old database connection?


>What am I doing wrong? Is it possible to workaround this problem? I
>guess the main question is: is it possible to fiddle with the objects
>in the service area, such as changing what they offer? And can this
>all be made in the configuration level? I would really like my
>component to be something like:
>
>MyBaseComponet (binding.Component):
>     # I'm just going to need my DM, he needs a ISQLConnection but
>     # my named service myapp.db is already offered as such.
>     SomeDM = binding.Obtain (myapp.model.SomeDM)

The correct way to do this, if I understand your use case correctly, is to 
make the DM's depend on a *specific* interface that describes what they 
actually require.  Then, set up a [Component Factories] entry that maps 
that specific interface over to myapp.db.




More information about the PEAK mailing list