2012-04-19 22 views
29

Così, ho un metodo esposto da un servizio WCF in quanto tale:Linee guida per Dispose() e Ninject

public GetAllCommentsResponse GetAllComments(GetAllCommentsRequest request) 
{ 
    var response = new GetAllCommentsResponse(); 

    using(_unitOfWork) 
     try 
     { 
      Guard.ArgNotNull(request, "request"); 

      var results = _unitOfWork.CommentRepository.Get(d => d.Id > 0).ToArray(); 

      //... Do rest of stuff here 
     } 
     catch (Exception ex) 
     { 
      response.Success = false; 
      response.FailureInformation = ex.Message; 
      Logger.LogError("GetAllComments Method Failed", ex); 
     } 

    return response; 
} 

Ho un oggetto DataUnitOfWork globale (che implementa IDisposable) che viene istanziato da Ninject attraverso un costruttore argomento quando una chiamata di servizio entra. quando debug, se uso

using(_unitOfWork) 

dell'oggetto _unitOfWork viene disposta immediatamente dopo uscendo dal suo ambito poi viene chiamato nuovamente Ninject (anche se è stato contrassegnato come disposto, così non succede nulla.) Senza l'istruzione using, Ninject gestisce lo smaltimento.

Per farla breve, esiste una regola generale per questo? Ho avuto paura dell'intera cosa idisposabile dopo che tutto quello che ho letto sembra indicare che non lo uso mai, o che lo uso in certe situazioni eclettiche, ma mi confonde sempre.

Qualsiasi input è apprezzato.

Oh, anche mentre sto digitando comunque, perché è esattamente una chiamata a GC.SuppressFinalize() quando si smaltisce? In che modo Dispose e Finalize differiscono?

+0

Trovato risposta in post simili: http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern – Nate222

+0

Il 'SuppressFinalize' dice al sistema GC 'Non preoccuparti di chiamare' Finalizza' quando hai determinato che l'oggetto è inutile dato che abbiamo già eseguito la pulizia grazie a qualcuno che ha chiamato esplicitamente "Dispose" su di esso. Se non lo fai, l'oggetto rimane nella coda del finalizzatore e Dispose _will_ viene chiamato di nuovo dal thread di Finalizer. –

risposta

45

Nella documentazione CLR si afferma che chiunque crei un oggetto monouso è responsabile della chiamata di Dispose. In questo caso l'oggetto è creato da Ninject. Ciò significa che dovresti chiamare non Dispose in modo esplicito.

Ninject dispone tutti gli oggetti monouso con un altro ambito diverso da InTransientScopeas soon as the scope object to which the created object is tied is collected by GC. Ecco perché ogni oggetto monouso deve essere Bind d con un ambito diverso da InTransientScope(). Per esempio. è possibile utilizzare InParentScope() da the NamedScope extension che eliminerà l'oggetto non appena l'oggetto in cui è stato iniettato è eliminato.

+2

Ciò significa che gli oggetti 'IDisposable' di InRequestScope saranno eliminati alla fine della richiesta? – AgentFire

+0

Sì, presupponendo che tu abbia fatto tutto correttamente, incluso l'utilizzo del modulo OncePerWebRequest –

+0

Per quanto ne so io, ninject non dispone mai nemmeno di InSingletonScope. – trampster

Problemi correlati