따라서 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;
}
서비스 호출이 들어올 때 생성자 인수를 통해 Ninject에 의해 인스턴스화되는 (IDisposable을 구현하는) 전역 DataUnitOfWork 객체가 있습니다. 디버깅할 때
using(_unitOfWork)
를 사용하면 _unitOfWork 객체가 범위를 벗어난 후 즉시 폐기된 다음 Ninject에 의해 다시 호출됩니다(폐기된 것으로 표시되어 있으므로 아무 일도 일어나지 않습니다.) 사용하는 문이 없으면 Ninject가 폐기 처리를 처리합니다.
간단히 말해서, 이에 대한 일반적인 경험 법칙이 있을까요? 제가 읽은 모든 글에서 절대로 사용하지 말라고 하거나 특정 절충적인 상황에서만 사용하라고 하는 것 같아서 일회용이라는 단어 자체가 두려웠는데, 항상 혼란스러웠습니다.
어떤 의견이라도 감사하겠습니다.
아, 그리고 어쨌든 여기에 타이핑하는 동안 폐기 할 때 GC.SuppressFinalize ()를 호출하는 이유는 정확히 무엇입니까? 처분과 최종화는 어떻게 다른가요?
CLR 문서에 따르면 일회용 객체를 생성하는 사람은 Dispose를 호출할 책임이 있다고 명시되어 있습니다. 이 경우 객체는 Ninject에 의해 생성됩니다. 즉, Dispose를 명시적으로 호출해서는 안 됩니다.
생성된 객체가 연결된 스코프 객체가 GC]1에 의해 수집되는 즉시, Ninject는 InTransientScope
이외의 다른 스코프를 가진 모든 Disposable 객체를 폐기합니다. 그렇기 때문에 모든 일회용 객체는 InTransientScope()
가 아닌 범위로 Bind
해야 합니다. 예를 들어, NamedScope 확장의 InParentScope()
를 사용하면 주입된 객체가 가비지 수집되는 즉시 객체를 처분할 수 있습니다.