.net UnityContainer.Teardown方法应该做什么?

.net UnityContainer.Teardown方法应该做什么?,.net,unity-container,.net,Unity Container,我想明确地“释放”Unity解析的对象实例。我希望撕下的方法正好用于此目的,因此我尝试了以下方法: container.RegisterType(typeof(IMyType), typeof(MyType), new MyLifetimeManager()); var obj = container.Resolve<IMyType>(); ... container.Teardown(obj); container.RegisterType(typeof(IMyType

我想明确地“释放”Unity解析的对象实例。我希望撕下的方法正好用于此目的,因此我尝试了以下方法:

container.RegisterType(typeof(IMyType), typeof(MyType), 
    new MyLifetimeManager());
var obj = container.Resolve<IMyType>();
...
container.Teardown(obj);
container.RegisterType(typeof(IMyType),typeof(MyType),
新的MyLifetimeManager());
var obj=container.Resolve();
...
容器拆卸(obj);
MyLifetimeManager
将对象实例存储在
HttpContext.Current.Items
中。我希望
Teardown
方法将调用lifetymanager上的
RemoveValue
,并释放MyType实例和lifetymanager实例。它不起作用。首先,不会调用
RemoveValue
,如果我再次调用
Resolve
,我将得到以前已解析的实例

Teardown
方法应该做什么?我如何才能释放对象,尽管他是终身管理者

编辑:


如果
Teardown
没有释放实例,谁会释放?谁在lifetime manager上调用
RemoveValue

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();
                }
            }

查看MSDN上模糊的“清理”注释,我假设TearDown返回一个原始对象,就好像它是新创建的一样(虽然查看Unity源代码,但根本看不到许多TearDown的实现在做任何事情……但没有时间检查它们)实际上我想从HttpContext中删除它,因为在使用此特殊方法之后,我需要Unity来创建新实例。您想从HttpContext中删除项并通过调用容器重新填充。在同一请求中解决所有问题?是的,这正是我想要的。我有一个特殊的方法,只是偶尔调用(会话启动),但它仍然是实际http请求的一部分。我需要这个方法来调用container.Resolve并获得“临时”实例,该实例被释放,以便请求的其余部分获得自己的实例。原因是我使用ParameterOverrides将一些参数传递到依赖关系层次结构,这些参数在初始化方法中是不同的。我不希望请求的其余部分与使用这些参数初始化的实例一起工作。完全不要使用生存期管理器。因此,每次调用Resolve时,都会创建一个新实例。这个实例可以通过它自己的dispose实现进行处理。