Unity和TransientLifetimeManager

L-F*_*our 6 c# asp.net-mvc dependency-injection unity-container

这是一个小问题,只是为了确保我正确理解Unity.

我在ASP.NET MVC应用程序中使用Unity,我已经注册了如下类型:

 container.RegisterType<IPizzaService, PizzaService>(); 
Run Code Online (Sandbox Code Playgroud)

我在控制器中使用它,如:

public class PizzaController : Controller
{
    private IPizzaService _pizzaService;

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

    [HttpGet]
    public ActionResult Index()
    {
        var pizzasModel = _pizzaService.FindAllPizzas();
        ...        
    }        
}
Run Code Online (Sandbox Code Playgroud)

每次页面请求完成时,IPizzaService都会注入并使用新的实例.所以一切正常.

我的问题:我必须做一些特殊处理这个实例吗?我假设,一旦请求结束,控制器就会被处理掉,而PizzaService实例最终会被垃圾收集.

如果我需要确定性地处理实例,因为它使用实体框架上下文或非托管资源,我必须覆盖控制器的Dispose,并确保我自己调用实例的dispose.

对?如果没有,请解释原因:)

谢谢!

Kei*_*yne 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

该博客包含 DisposeTransientLifetimeManager 和 DisusingSharedLifetimeManager 的代码。使用扩展,容器可以调用Dispose()您的一次性对象。

需要注意的是,您需要引用正确(较旧)版本的 Microsoft.Practices.Unity.Configuration.dll 和 Microsoft.Practices.Unity.dll。