我想明确“释放”Unity解析的对象实例。我希望Teardown方法应该完全用于此,所以我尝试了这样的事情:
container.RegisterType(typeof(IMyType), typeof(MyType),
new MyLifetimeManager());
var obj = container.Resolve<IMyType>();
...
container.Teardown(obj);
MyLifetimeManager
将对象实例存储在HttpContext.Current.Items
中。我希望Teardown
方法将在生命周期管理器上调用RemoveValue
并释放MyType实例和生命周期管理器实例。它不起作用。首先,RemoveValue
未被调用,如果我再次调用Resolve<IMyType>
,我将获得之前已解析的实例。
Teardown
方法应该做什么?尽管有他的终身经理,我怎么能释放对象?
修改:
如果Teardown
没有发布实例,谁呢?谁在终身经理上致电RemoveValue
?
答案 0 :(得分:4)
Unity TearDown不会开箱即用。您不需要从HttpContext.Current.Items中删除它,因为它将在请求结束时自动清除。您可能想要做的是在存储在那里的任何IDisposable对象上调用Dispose。您可以从Global.asax中的EndRequest执行此操作:
foreach (var item in HttpContext.Current.Items.Values)
{
var disposableItem = item as IDisposable;
if (disposableItem != null)
{
disposableItem.Dispose();
}
}