¿Cuál es la mejor manera de implementar eventos encadenados en C #?

Tengo el siguiente escenario. El código del cliente solo tiene acceso a FooHandler, no directamente a las instancias de Foo.

public delegate void FooLoaded(object sender, EventArgs e);

class Foo {
    public event FooLoaded loaded;
    /* ... some code ... */
    public void Load() { load_asynchronously(); }
    public void callMeWhenLoadingIsDone() { loaded(this,EventArgs.Empty); }
}

class FooHandler {
    public event FooLoaded OneFooLoaded;

    /* ... some code ... */

    public void LoadAllFoos() { 
        foreach (Foo f in FooList) { 
            f.loaded += new FooLoaded(foo_loaded);
            f.Load(); 
        } 
    }

    void foo_loaded(object sender, EventArgs e) {
        OneFooLoaded(this, e);
    }

}

Luego, los clientes usarían el evento OneFooLoaded de la clase FooHandler para recibir notificaciones de carga de foos. ¿Es este "encadenamiento de eventos" lo que se debe hacer? ¿Hay alguna alternativa? No me gusta esto (se siente mal, no puedo expresar con precisión por qué), pero si quiero que el controlador sea el punto de acceso, no tengo muchas alternativas.

Respuestas a la pregunta(5)

Su respuesta a la pregunta