Voglio evitare la dipendenza ciclica in questo schema:
DbRepository
ha bisogno di IUserDbEntityFactory
per creare User
entità che ha bisogno di IUserPublishedInfoInitializer
per creare UserPublishedInfo
su richiesta. E UserPublishedInfoInitializer
stessa ha bisogno di IDbRepository
per verificare se l'utente è attualmente presente nella cache e attivo per impostare la proprietà IsOnline
su UserPublishedInfo
.
Entrambi i metodi CreateUser
e TryGetCachedUser
utilizzano le stesse cose interne come la memorizzazione nella cache e i blocchi all'interno di DbRepository
.
User
è un'entità db radice di aggregazione senza interfaccia.
DbRepository
richiede IUserDbEntityFactory
che richiede IUserPublishedInfoInitializer
per costruire User
e riporta la dipendenza ciclica a DbRepository
. Di solito uso l'iniezione della dipendenza del costruttore, ma in questo caso non funzionerà a causa della dipendenza ciclica, quindi questa è la domanda.
Inoltre, non voglio spostare MakePublishedInfo
su User
perché in effetti è una conversazione implicita in C # e viene usata molto frequentemente nel codice.
E passare IDbRepository
a IUserPublishedInfoInitializer.Init
come argomento non è né cosa voglio perché perché questa implementazione dovrebbe dipendere da cosa la sta usando? Questo rompe l'incapsulamento.
Solo sullo schema User
e UserPublishedInfo
sono oggetti creati dinamicamente (altri vengono creati all'avvio).
Dovrei cambiare questo disegno e come dovrebbe essere?