Richtlinien für Dispose () und Ninject
So, ich habe eine Methode ausgesetzt, die von einem WCF-Dienst als solchen:
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;
}
Ich habe eine Globale DataUnitOfWork Objekt (die IDisposable implementiert), die instanziiert von Ninject durch einen Konstruktor-argument, wenn ein service-Aufruf kommt. Beim Debuggen, wenn ich
using(_unitOfWork)
den _unitOfWork Objekt wird entsorgt unmittelbar nach dem gehen out of scope dann aufgerufen wird, wird wieder von Ninject (obwohl es war markiert als entsorgt, so passiert gar nichts). Ohne die using-Anweisung, Ninject übernimmt die Entsorgung.
Lange Rede kurzer Sinn, gibt es eine Faustregel dafür? Ich habe Angst vor den ganzen IDisposable Sache, nach allem, was ich lese, scheint zu zeigen, nie zu verwenden, oder verwenden Sie es in bestimmten vielseitige Situationen, aber es immer verwirrt mich.
Jede Eingabe wird sehr geschätzt.
Oh, auch während ich hier die Eingabe sowieso, warum genau gibt es einen Aufruf von GC.SuppressFinalize() bei der Entsorgung? Wie Dispose und Finalize unterscheiden?
InformationsquelleAutor der Frage Nate222 | 2012-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
CLR-Dokumentation besagt, dass, wer erstellt ein Wegwerf-Objekt ist verantwortlich für den Aufruf von Dispose. In diesem Fall ist das Objekt erstellt von Ninject. Das bedeutet, dass Sie sollten nicht Aufruf von Dispose explizit.
Ninject verfügt über jede Wegwerf-Objekt, das hat einen anderen Umfang, andere als
InTransientScope
sobald das scope-Objekt, auf das das angelegte Objekt gebunden ist, gesammelt von GC. Das ist, warum jeder Wegwerf-Objekt sollteBind
d mit einem Bereich, der nichtInTransientScope()
. E. g. Sie könnenInParentScope()
aus die NamedScope Erweiterungdie Entsorgen das Objekt, sobald das Objekt, das es eingespeist wird, ist die garbage Collection.InformationsquelleAutor der Antwort Remo Gloor