这是一个小问题,只是为了确保我正确理解Unity。
我在ASP.NET MVC应用程序中使用Unity,我已经注册了如下类型:
container.RegisterType<IPizzaService, PizzaService>();
我在控制器中使用它,如:
public class PizzaController : Controller
{
private IPizzaService _pizzaService;
public PizzaController(IPizzaService pizzaService)
{
_pizzaService = pizzaService;
}
[HttpGet]
public ActionResult Index()
{
var pizzasModel = _pizzaService.FindAllPizzas();
...
}
}
每次页面请求完成时,都会注入并使用IPizzaService
的新实例。所以一切正常。
我的问题:我是否必须做一些特殊的处理这个实例?我假设,一旦请求结束,控制器就会被处理掉,而PizzaService实例最终会被垃圾收集。
如果我需要确定性地处理实例,因为它使用实体框架上下文或非托管资源,我必须覆盖控制器的Dispose,并确保我自己调用实例的处理。
右?如果没有,请解释原因:))
谢谢!
答案 0 :(得分:1)
IMO,无论创造一次性物品,都要负责处理它。当容器通过RegisterType<I, T>()
注入一次性对象时,我想保证该对象已准备好使用。但是,使用RegisterInstance<I>(obj)
会自动处理您的对象。
对于IOC容器来说这可能很难,并且开箱即用的Unity是不可能的。但是,我总是使用一些非常漂亮的代码:
http://thorarin.net/blog/post/2013/02/12/Unity-IoC-lifetime-management-IDisposable-part1.aspx
该博客包含DisposingTransientLifetimeManager和DisposingSharedLifetimeManager的代码。使用扩展,容器在您的一次性对象上调用Dispose()
。
有一点需要注意,您需要引用Microsoft.Practices.Unity.Configuration.dll&amp;的正确(较旧)版本。 Microsoft.Practices.Unity.dll。