2014-10-30 16 views
5

Đây là một câu hỏi nhỏ, chỉ để đảm bảo rằng tôi hiểu được Unity một cách chính xác.Unity và TransientLifetimeManager

Tôi đang sử dụng Unity trong một ứng dụng ASP.NET MVC, và tôi đã đăng ký một loại như sau:

container.RegisterType<IPizzaService, PizzaService>(); 

Và tôi đang sử dụng nó trong một bộ điều khiển như:

public class PizzaController : Controller 
{ 
    private IPizzaService _pizzaService; 

    public PizzaController(IPizzaService pizzaService) 
    { 
     _pizzaService = pizzaService; 
    } 

    [HttpGet] 
    public ActionResult Index() 
    { 
     var pizzasModel = _pizzaService.FindAllPizzas(); 
     ...   
    }   
} 

Mỗi lần yêu cầu trang được thực hiện, một phiên bản mới của IPizzaService được tiêm và sử dụng. Vì vậy, tất cả điều này hoạt động tốt.

Câu hỏi của tôi: tôi có phải làm gì đặc biệt để vứt bỏ trường hợp này không? Tôi giả sử rằng, một khi yêu cầu đã kết thúc, bộ điều khiển được xử lý và cá thể PizzaService cuối cùng bị thu gom rác.

Nếu tôi cần xử lý xác định đối tượng vì nó sử dụng bối cảnh khung thực thể hoặc tài nguyên không được quản lý, tôi phải ghi đè Vứt bỏ bộ điều khiển và đảm bảo tôi tự mình hủy bỏ các cá thể đó.

Phải không? Nếu không, vui lòng giải thích lý do tại sao :)

Cảm ơn!

+0

Rất nhiều thông tin [ở đây] (http://msdn.microsoft.com/en-us/library/ff660872%28v=pandp.20%29.aspx) nhưng tôi không nghĩ rằng người quản lý thoáng qua yêu cầu bạn vứt bỏ nó. –

+1

@JeroenVannevel Trên thực tế, 'TransientManager' không gọi vứt bỏ cho bạn. –

Trả lời

1

IMO, bất kỳ điều gì tạo ra một đối tượng dùng một lần đều có trách nhiệm xử lý nó. Khi thùng chứa tiêm một đối tượng dùng một lần qua RegisterType<I, T>(), tôi muốn đảm bảo rằng đối tượng đã sẵn sàng để sử dụng. Tuy nhiên, việc sử dụng RegisterInstance<I>(obj) sẽ tự động loại bỏ đối tượng của bạn.

Điều này có thể khó khăn với một thùng chứa IOC và không thể với Unity ra khỏi hộp. Tuy nhiên, có một số mã thực sự tiện lợi trên mạng mà tôi sử dụng tất cả các thời gian:

http://thorarin.net/blog/post/2013/02/12/Unity-IoC-lifetime-management-IDisposable-part1.aspx

Các blog có mã cho một DisposingTransientLifetimeManager và DisposingSharedLifetimeManager. Sử dụng các tiện ích mở rộng, vùng chứa gọi số Dispose() trên các đối tượng dùng một lần của bạn.

Một lưu ý là bạn cần tham khảo phiên bản (cũ) của Microsoft.Practices.Unity.Configuration.dll & Microsoft.Practices.Unity.dll.

+0

Cảm ơn, nhưng trong trường hợp cụ thể mà tôi đã mô tả trong câu hỏi của tôi, có cần vứt bỏ rõ ràng hay liệu người thu gom rác có vứt bỏ nó không? –

+0

GC cuối cùng sẽ vứt bỏ mọi thứ. Nhưng đó có thể là một thời gian dài. Thu gom rác được quản lý trong một quy trình. Trong IIS, một process = một pool ứng dụng, nhưng có thể nhiều hơn một miền ứng dụng .NET (các trang web có thể chia sẻ cùng một pool ứng dụng). Do đó, một GC có thể được chia sẻ giữa một số yêu cầu web. Vì vậy, bạn nên tiếp tục vứt bỏ tài nguyên ngay khi có thể, thay vì đợi GC thực hiện. –

+0

Vậy điều đó có nghĩa là tất cả các ví dụ thể hiện Unity và TransientLifetimeManager đều thực sự làm sai? Sau đó, trong trường hợp nào TransientLifetimeManager được sử dụng? –