[Seaside] Application context

Pat Maddox pat.maddox at gmail.com
Wed May 20 07:50:22 UTC 2009


On Sun, May 17, 2009 at 8:35 PM, Ramon Leon <ramon.leon at allresnet.com> wrote:
>>
>> There are a few different ways for objects to get a dependency,
>> looking up a singleton is only one of them.  I'd prefer not to use it.
>>  Let me show you some fake code that should hopefully demonstrate what
>> I want to do better than I've explained it so far.
>>
>> MyBlogApp new userRepository: UserRepository new;
>>    mountAt: '/us/blog';
>>    run.
>>
>> MyBlogApp new userRepository: UserRepository new;
>>    mountAt: '/ca/blog';
>>    run.
>>
>> Each of those is an instance of my blog app, and runs separately from
>> the other.  The userRepository automatically gets injected into the
>> components that make up the application.  This way they can just look
>> up their local instance variable as opposed to grabbing a singleton.
>>
>> Is that clearer?  That's the gist of what I'm trying to do.  Now I
>> just need to know how to do it with Seaside.
>>
>> Pat
>
> Ah, I see, you're wanting to be involved in the creation of the root
> instance of your component and hand in the dependency there.  What you're
> looking for is a custom render loop, subclass WARenderLoopMain so you can
> override #createRoot and control the creation of your component.  Then you
> can pass in any dependencies you like during the construction of your
> component.
>
> You can plug in your render loop during the registration of your app on a
> mount point.
>
> YourRootClass class>>initialize
>     | app |
>     app := self registerAsApplication: 'someAppName'.
>     app preferenceAt: #mainClass put: YourRenderLoop.
>     ^ app

The *real* reason for this question, though I didn't know it at the
time, was that I was asking myself "how am I going to test this?"  So
I wanted to know a way to inject fake repositories in.  I definitely
didn't need to be able to configure it at the root - right now it's a
good assumption that there's only one user repository for my app.

I created a class, ANUserRepository, and then pointed the global var
AccountRepository at a new instance.  I pointed another global
DevAccountRepository at that instance as well.  Now in the setUp
method of my test I set AccountRepository to a fresh instance for
testing purposes, and in tearDown I reset it to DevAccountRepository
so I can still click around in the browser.

Thanks again James & Ramon for your feedback.

Pat


More information about the seaside mailing list