2012-04-19 19 views
29

lo tanto, tengo un método expuesto de un servicio WCF como tal:Directrices para Dispose() y 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; 
} 

que tienen un objeto DataUnitOfWork mundial (que implementa IDisposable) que obtiene una instancia por Ninject través de un constructor argumento cuando una llamada de servicio. cuando se recibe la depuración, si uso

using(_unitOfWork) 

el objeto _unitOfWork se dispone inmediatamente después de salir del alcance continuación, se vuelve a llamar de nuevo por Ninject (aunque ha sido marcado como dispuesto, así que no pasa nada.) Sin la declaración using, Ninject maneja la eliminación.

En resumen, ¿hay una regla general para esto? He tenido miedo de todo lo que es identificable después de que todo lo que leo me indica que nunca lo use, o lo uso en ciertas situaciones eclécticas, pero siempre me ha confundido.

Se agradece cualquier entrada.

Ah, también mientras estoy aquí escribiendo de todos modos, ¿por qué exactamente hay una llamada a GC.SuppressFinalize() al desechar? ¿Cómo se diferencian Dispose y Finalize?

+0

Respuestas encontradas en publicaciones similares: http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern – Nate222

+0

El 'SuppressFinalize' le dice al sistema de GC 'No se preocupe por llamar a' Finalize' cuando usted ha determinado que el objeto es basura ya que hemos realizado la limpieza gracias a alguien que explícitamente llamó 'Dispose' en él. Si no lo hace, el objeto permanece en la cola del finalizador y Desechar _se volverá a llamar desde la secuencia del Finalizador. –

Respuesta

45

La documentación de CLR establece que quien crea un objeto desechable es responsable de llamar a Dispose. En este caso, el objeto es creado por Ninject. Eso significa que debe no llamar Eliminar de forma explícita.

Ninject dispone de cada objeto desechable que tiene otro alcance que no sea InTransientScopeas soon as the scope object to which the created object is tied is collected by GC. Es por eso que cada objeto desechable debe ser Bind d con un alcance que no sea InTransientScope(). P.ej. puede usar InParentScope() desde the NamedScope extension que eliminará el objeto tan pronto como se inyecte el objeto en el que se inyecta.

+2

¿Qué significa que en InRequestScope los objetos 'IDisposable' se eliminarán al final de la solicitud? – AgentFire

+0

Sí, suponiendo que ha hecho todo correctamente, incluido el uso del módulo OncePerWebRequest –

+0

Por lo que puedo decir, ninject nunca descarta InSingletonScope tampoco. – trampster