2011-02-08 31 views
6

Tôi muốn rõ ràng "giải phóng" đối tượng được giải quyết bởi Unity. Tôi hy vọng phương pháp Teardown nên được sử dụng một cách chính xác cho điều này vì vậy tôi cố gắng một cái gì đó như thế này:Phương thức UnityContainer.Teardown nên làm gì?

container.RegisterType(typeof(IMyType), typeof(MyType), 
    new MyLifetimeManager()); 
var obj = container.Resolve<IMyType>(); 
... 
container.Teardown(obj); 

MyLifetimeManager cửa hàng đối tượng dụ trong HttpContext.Current.Items. Tôi hy vọng rằng phương pháp Teardown sẽ gọi RemoveValue trên trình quản lý lâu dài và phát hành cả phiên bản MyType và phiên bản trình quản lý lâu dài. Nó không hoạt động. Trước hết, RemoveValue không được gọi và nếu tôi gọi lại số Resolve<IMyType>, tôi sẽ nhận được bản sao đã được giải quyết trước đó.

Phương thức Teardown nên làm gì? Làm thế nào tôi có thể giải phóng đối tượng bất chấp người quản lý suốt đời của mình?

Edit:

Nếu Teardown không nhả dụ, ai làm? Ai gọi số RemoveValue trên người quản lý lâu dài?

+0

xem xét "làm sạch nó" mơ hồ trên MSDN, tôi giả định TearDown trả về một đối tượng nguyên sơ, như thể nó vừa được tạo. – Massif

+0

(Mặc dù nhìn qua nguồn Unity, không thể thấy nhiều triển khai của Teardown làm bất cứ điều gì cả ... Nhưng không có thời gian để kiểm tra tất cả.) – Massif

Trả lời

4

Unity TearDown không làm bất cứ điều gì ngoài hộp. Bạn không cần phải loại bỏ từ HttpContext.Current.Items vì nó sẽ được xóa tự động ở phần cuối của yêu cầu. Những gì bạn có thể muốn làm là gọi Dispose trên bất kỳ đối tượng IDisposable nào được lưu trữ ở đó. Bạn sẽ thực hiện điều này từ EndRequest trong Global.asax:

foreach (var item in HttpContext.Current.Items.Values) 
      { 
       var disposableItem = item as IDisposable; 

       if (disposableItem != null) 
       { 
        disposableItem.Dispose(); 
       } 
      } 
+0

Thực ra tôi muốn xóa nó khỏi HttpContext vì sau phương pháp đặc biệt này tôi cần Unity để tạo phiên bản mới. –

+0

Bạn muốn xóa (các) mục khỏi HttpContext và repopulate bằng cách gọi container.Resolve tất cả trong cùng một yêu cầu? –

+0

Vâng, đó chính là điều tôi muốn. Tôi có phương pháp đặc biệt được gọi là occasionaly (bắt đầu phiên) nhưng nó vẫn là một phần của yêu cầu http thực tế. Tôi cần phương pháp này để gọi container.Resolve và nhận được "tạm thời" dụ được phát hành để phần còn lại của yêu cầu được ví dụ riêng của mình. Lý do là tôi đang sử dụng ParameterOverrides để chuyển một số đối số vào hiearchy phụ thuộc và các đối số này khác nhau trong phương thức khởi tạo. Tôi không muốn phần còn lại của yêu cầu làm việc với instance được khởi tạo với các đối số này. –

Các vấn đề liên quan