Tôi có một trình bao bọc đơn giản cho bộ chứa Unity IoC (sử dụng tạm thời Dịch vụ định vị [chống] Mô hình giới thiệu DI cho một mã số cũ) và từ IUnityContainer
trong Unity thực hiện IDisposable
I muốn phơi bày điều đó thông qua trình bao bọc.Tràn ngăn xếp khi loại bỏ tài nguyên được quản lý
Các wrapper đơn giản là đủ:
public class IoCContainer : IIoCContainer
{
private IUnityContainer _container;
public IoCContainer(IUnityContainer container)
{
_container = container;
}
public T Resolve<T>()
{
return _container.Resolve<T>();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~IoCContainer()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
if (_container != null)
{
_container.Dispose();
_container = null;
}
}
}
IIoCContainer
là giao diện miền mà không có gì nhưng T Resolve<T>()
vào nó, và tất nhiên IDisposable
. Vì vậy, mọi thứ bên dưới rằng một phương pháp đơn giản là việc triển khai IDisposable
as I found it on MSDN.
Tuy nhiên, khi .Dispose()
được gọi trên đối tượng này (chẳng hạn như khi thoát khỏi khối using
), hãy tăng số StackOverflowException
. Gỡ lỗi, có vẻ như các cuộc gọi stack lặp đi lặp lại giữa:
Dispose()
được gọi vào lớp này- nào gọi
Dispose(true)
trên lớp này - nào gọi
Dispose()
trênIUnityContainer
- nào gọi
Dispose()
trên lớp này
tôi có thể giải quyết này trong trường hợp này bằng cách đặt một lá cờ bool
trên lớp, đặt nó trên dòng đầu tiên của Dispose()
, và kiểm tra nó trong Dispose(bool)
, vì vậy đệ quy kết thúc vào lần lặp thứ hai của mình. Nhưng tại sao điều này lại xảy ra ngay từ đầu? Tôi chỉ có thể giả định rằng tôi đã bỏ lỡ điều gì đó hiển nhiên hoặc hiểu nhầm điều gì đó về việc xử lý tài nguyên. Nhưng cái gì?
bạn đã thêm 'IIoCContainer' vào vùng chứa thống nhất chưa? – Rhumborl
Đây có thể là một câu hỏi ngớ ngẩn, nhưng là 'this' và' _container' cùng một đối tượng? – adv12
@Rhumborl: Tôi nghĩ rằng đó có thể là vấn đề, bây giờ bạn chỉ ra. Các quy ước được sử dụng khi đăng ký bao gồm các hội đồng có chứa điều này rất thực hiện. Vì vậy, có lẽ 'UnityContainer' đang giữ một tham chiếu đến một' IoCContainer' đã giải quyết và đang xử lý nó? Tôi sẽ kiểm tra và xem những gì tôi có thể tìm thấy. Tôi không thể nghĩ một cách rõ ràng về một trường hợp mà tôi cần phải * giải quyết * một trường hợp của vùng chứa này, vì vậy có thể an toàn để loại trừ nó khỏi đăng ký. – David