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?
Trovato risposta in post simili: http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern – Nate222
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. –