Vì vậy, tôi có một phương pháp tiếp xúc từ một dịch vụ WCF như vậy:Hướng dẫn cho Dispose() và 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;
}
Tôi có một đối tượng DataUnitOfWork toàn cầu (mà thực hiện IDisposable) đó được khởi tạo bởi Ninject qua một constructor Lập luận khi một cuộc gọi dịch vụ đi kèm trong. khi gỡ lỗi, nếu tôi sử dụng
using(_unitOfWork)
đối tượng _unitOfWork được xử lý ngay lập tức sau khi đi ra khỏi phạm vi sau đó được gọi là một lần nữa bởi Ninject (mặc dù nó được đánh dấu là xử lý, vì vậy không có gì xảy ra.) Không có câu lệnh sử dụng, Ninject xử lý việc xử lý.
Tóm tắt câu chuyện dài, có quy tắc chung nào về điều này không? Tôi đã sợ hãi của toàn bộ điều IDisposable sau khi tất cả mọi thứ tôi đọc dường như chỉ ra không bao giờ sử dụng nó, hoặc sử dụng nó trong một số tình huống chiết trung, nhưng nó luôn luôn nhầm lẫn với tôi.
Bất kỳ đầu vào nào được đánh giá cao.
Ồ, cũng trong khi tôi đang ở đây gõ anyway, tại sao chính xác là có một cuộc gọi đến GC.SuppressFinalize() khi xử lý? Làm thế nào để vứt bỏ và hoàn thành khác nhau?
Tìm thấy câu trả lời trong bài đăng tương tự: http://stackoverflow.com/questions/898828/c-sharp-finalize-dispose-pattern – Nate222
'SuppressFinalize' cho hệ thống GC 'Đừng lo lắng về việc gọi' Hoàn tất' khi bạn đã xác định đối tượng là rác vì chúng tôi đã thực hiện dọn dẹp nhờ ai đó explicityl gọi là 'Vứt bỏ' trên đó. Nếu bạn không làm điều này, đối tượng vẫn còn trên hàng đợi finalizer và Dispose _will_ được gọi lại từ thread Finalizer. –