[Team System] TeamFoundationServerFactory e TeamFoundationServer.Dispose

Sempre sulla scia della mia indagine sugli oggetti TeamFoundationServer creati mediante TeamFoundationServerFactory ho notato un altro dettaglio: se creiamo più oggetti con la Factory e poi si invoca Dispose su uno di essi tutti gli oggetti diventano inutilizzabili (perché sono banalmente lo stesso oggetto)!!!

TeamFoundationServer tfs1 = TeamFoundationServerFactory.GetServer("http://tfsrtmsp1:8080");
tfs1.Authenticate();
TeamFoundationServer tfs2 = TeamFoundationServerFactory.GetServer("http://tfsrtmsp1:8080");
tfs2.Authenticate();
tfs1.Dispose();
VersionControlServer vfs2 = (VersionControlServer)tfs2.GetService(typeof(VersionControlServer));
L'ultima linea, infatti, genera una bella NullReferenceException!
In effetti basta verificare che object.ReferenceEquals(tfs1, tfs2) é effettivamente true!

Quindi, se usate la Factory NON fate il dispose del TeamFoundationServer fino alla fine del programma a quando non siete certi che non ne usate più da nessuna parte!!!

Print | posted on martedì 4 settembre 2007 18:16

Comments on this post

# re: [Team System] TeamFoundationServerFactory e TeamFoundationServer.Dispose

Requesting Gravatar...
Ciao Michele!

interessante questa serie di post su TFS, continua così.

In questo specifico caso direi che il comportamente però è prevedibile perchè secondo me la Factory tiene traccia dei "server" che ti ha rilasciato e dato che la seconda volta gli chiedi sempre lo stesso server (stesso url e stessa porta) direi che giustamente ti ritorna un riferimento all'oggetto precedente.

Ciao!
.m
Left by Mauro Servienti on set 04, 2007 5:01

# re: [Team System] TeamFoundationServerFactory e TeamFoundationServer.Dispose

Requesting Gravatar...
Concordo con Mauro...Visto che il metodo si chiama Get ti ritorna un oggetto... se ne fai la Dispose... ;-)

Potresti aggiungere un commento nella sezione Wiki di MSDN a riguardo
Left by Lorenzo Barbieri on set 04, 2007 5:25

# re: [Team System] TeamFoundationServerFactory e TeamFoundationServer.Dispose

Requesting Gravatar...
Sì, sì, avete ragione, infatti ero in dubbio se postare o meno questa cosa. Secondo me la parte ingannevole é proprio che non sia una property (tipo "DefaultInstance"), ma un metodo Get che mi fa pensare che mi ritorni oggetti diversi che condividono un "motore" anziché LA STESSA ISTANZA di TeamFoundationServer. Comunque le "stranezze" della Factory non sono finite qui, questa sera indago un altro strano comportamento... ;-)
Left by Michele Bernardi on set 04, 2007 6:48
Comments have been closed on this topic.