Рекомендации по Dispose() и Ninject
Итак, у меня есть метод, открытый из службы WCF как таковой:
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;
}
У меня есть глобальный объект DataUnitOfWork (который реализует IDisposable), который получает экземпляр Ninject через аргумент конструктора при вызове службы. При отладке, если я использую
using(_unitOfWork)
Объект _unitOfWork сразу же появляется после выхода из области действия, а затем снова вызывается Ninject (хотя он был помечен как удаленный, поэтому ничего не происходит). Без оператора using Ninject обрабатывает удаление.
Короче говоря, существует ли общее правило для этого? Я боялся всего IDisposable вещи после того, как все, что я читаю, кажется, указывает, что никогда не использовать его или использовать в определенных эклектичных ситуациях, но это меня всегда путало.
Приветствуется любой ввод.
О, также, пока я нахожусь здесь, все равно, почему именно есть вызов GC.SuppressFinalize() при утилизации? Как Dispose и Finalize отличаются?
Ответы
Ответ 1
В документации CLR указано, что тот, кто создает объект Disposable, отвечает за вызов Dispose. В этом случае объект создается Ninject. Это означает, что вы не должны явно вызывать Dispose.
Ninject предоставляет каждый объект Disposable, который имеет другую область, отличную от InTransientScope
как только объект области, к которому привязан созданный объект, собирается GC. Поэтому каждый объект Disposable должен быть Bind
d с областью, которая не является InTransientScope()
. Например. вы можете использовать InParentScope()
из расширение NamedScope, которое будет удалять объект, как только объект, в который он впрыснут, является собранным мусором.