Parliamo di tre progetti. Ho un progetto Cinema
, un progetto Cinema.Engine
e un progetto Cinema.Client1
.
Nel progetto Cinema
, ho un'interfaccia ICinema
e una classe factory CinemaFactory
.
Nel progetto Cinema.Engine
, ho una classe che implementa ICinema
... la chiameremo CinemaEngine : ICinema
. Questo progetto è esposto come servizio WCF che fa riferimento al progetto Cinema
.
Ciò consente al mio progetto Cinema.Client1
di fare riferimento solo al progetto Cinema
. Cinema.Client1
può chiamare CinemaFactory
e ottenere un riferimento al ICinema
fornito dal servizio WCF. Tutto va bene e bene ....... Ora diventa pignolo.
Aggiungiamo un quarto progetto chiamato Cinema.Client2
che ha riferimenti a entrambi i progetti Cinema
e Cinema.Engine
. Poiché ho un riferimento a Cinema.Engine
, voglio essere in grado di chiamare la mia fabbrica con un diverso set di parametri e avere il factory istanziare il motore localmente invece di chiamare il servizio WCF.
Nota importante: il progetto Cinema
non ha riferimenti ad altri progetti.
Quindi, se ho solo un riferimento al progetto Cinema
, la factory dovrebbe apparire così:
public class CinemaFactory {
public ICinema GetCinema (Uri RemoteCinema) {}
}
Ma se ho un riferimento a Cinema.Engine
, la factory dovrebbe apparire così:
public class CinameFactory {
public ICinema GetCinema (string CinemaParameters) {}
}
Per dirla in altro modo: Il cliente (residente in un progetto) deve ottenere un'istanza del motore (residente in un secondo progetto). Tale istanza sarà o un proxy per un servizio WCF o verrà istanziata localmente. Questa istanza sarà ottenuta da una fabbrica (residente in un terzo progetto). Il primo progetto (contenente il cliente) e il terzo progetto (contenente il motore) fanno entrambi riferimento al secondo progetto (contenente la fabbrica).
Se il client sta ottenendo il proxy, non dovrebbe avere bisogno di un riferimento al secondo progetto. Se il client ha un riferimento al secondo progetto, solo allora la fabbrica fornirà l'opzione di istanziare il motore localmente.
Come posso ottenere la fabbrica (nel terzo progetto) per istanziare il motore localmente (dal secondo progetto) senza avere un riferimento al secondo progetto (che causa un riferimento circolare)?
Cose che ho esaminato ma che non funzionano:
- Le classi parziali non funzionano. Le classi parziali sono zucchero sintattico e non può estendersi su progetti.
- Stessa classe, spazio dei nomi diverso (per la fabbrica): ma come faccio a sapere da quale spazio dei nomi estrarre la classe?
-
new
parola chiave: si applica solo ai membri, non a intere classi.