Unity和TransientLifetimeManager

时间:2014-10-30 10:19:11

标签: c# asp.net-mvc dependency-injection unity-container

这是一个小问题,只是为了确保我正确理解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,并确保我自己调用实例的处理。

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

谢谢!

1 个答案:

答案 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。