Questo è davvero un problema di progettazione. Il chiamante deve avere conoscenza (cioè "una dipendenza") sul lato interno di MyAClass - e in questo caso, non solo sul lato interno di MyAClass, ma anche internals dell'istanza MyBClass di MyAClass, l'istanza di MyCClass che BClass detiene, ecc. Ci sono diversi problemi con questo design - in particolare, sarà fragile e difficile da modificare (ad esempio, le modifiche a MyCClass potrebbero avere un impatto non solo su questo chiamante, ma anche su MyAClass, MyBClass, ecc.) E avere un problema di proprietà / ordine di istanziazione (cioè, come si menziona, "nessun controllo nullo") - questa API richiede che ciascuna delle classi abbia un'istanza non nulla di ogni oggetto già inizializzato, o peggio ancora, la proprietà "getter" eseguirà un controllo Null e quindi istanzia uno prima di restituire il nuovo oggetto. Questo è davvero pessimo perché ciò che assomiglia a una semplice chiamata "get" di una proprietà, potrebbe causare un'enorme allocazione o operazione di memoria.
Per farla breve, se il chiamante ha davvero bisogno di avere conoscenza di queste altre classi, forse è possibile ridisegnare l'API, in modo che il chiamante allochi le istanze di ciascuno degli oggetti (sia da un esplicito "nuovo" o tramite una fabbrica ) e li passa a MyAClass come argomenti del costruttore, rendendo effettivamente il chiamante il "proprietario".
Per quanto riguarda le immagini grandi, ti consiglio di leggere un ottimo libro che ho trovato di recente - API " Design per C ++ " di Martin Reddy - è incentrato sul C ++, ma i problemi di progettazione sono in gran parte gli stessi. Puoi anche consultare "C # efficace: 50 modi specifici per migliorare il tuo C #" di Bill Wagner e "C # più efficace: 50 modi specifici per migliorare il tuo C #" di Bill Wagner per alcuni utili suggerimenti sulla progettazione dell'API .NET.