c# - Pautas para Dispose() y Ninject
.net garbage-collection (1)
Entonces, tengo un método expuesto desde un servicio WCF como tal:
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;
}
Tengo un objeto global DataUnitOfWork (que implementa IDisposable) que Ninject crea una instancia a través de un argumento de constructor cuando entra una llamada de servicio. Al depurar, si uso
using(_unitOfWork)
El objeto _unitOfWork se desecha inmediatamente después de salir del ámbito y luego es llamado nuevamente por Ninject (aunque se ha marcado como desechado, por lo que no ocurre nada). Sin la instrucción using, Ninject se encarga de la eliminación.
En pocas palabras, ¿hay una regla general para esto? He tenido miedo de todo lo que se puede hacer después de que todo lo que leo parece indicar nunca usarlo o usarlo en ciertas situaciones eclécticas, pero siempre me ha confundido.
Cualquier entrada es apreciada.
Oh, también mientras estoy aquí escribiendo de todos modos, ¿por qué exactamente hay una llamada a GC.SuppressFinalize () al desechar? ¿En qué se diferencia y finaliza Dispose?
La documentación de CLR indica que quien crea un objeto desechable es responsable de llamar a Dispose. En este caso el objeto es creado por Ninject. Eso significa que no debes llamar a Dispose explícitamente.
Ninject desecha cada objeto desechable que tiene otro alcance que no sea InTransientScope
tan pronto como InTransientScope
el objeto de alcance al que está vinculado el objeto creado . Es por eso que todo objeto desechable debe estar Bind
con un alcance que no sea InTransientScope()
. Por ejemplo, puede usar InParentScope()
de la extensión NamedScope que desechará el objeto tan pronto como el objeto en el que se inyecta se recolecte la basura.