There are more dynamic ways to create these relationships. For
instance, the page could iterate through the child controls, looking for user
controls that implement the target interface that is designed for the observer
pattern only. This would make it easier to register, but means that every user
control will be registered.
In the stateless environment, the observers must be setup on
every page load, unless the observer collection is serialized and stored in
viewstate. Each observer object cannot be stored directly in viewstate, but
alternatively the collection could store the ID of the control, and retrieve
the control again later through the Page.FindControl method. The state of the
control can be stored and the observer does not need to be notified every time;
however, in real-time systems, where querying the data frequently is a must,
this may be desired.