何时使用Request.RegisterForDispose?

Sni*_*tor 5 asp.net asp.net-mvc asp.net-web-api

对于ASP.NET Web API,我一直在研究自己的实现,IHttpControllerActivator并且想知道何时(或为什么?)使用HttpRequestMessage扩展方法" RegisterForDispose".

我看到这样的例子,我可以看到它的相关性,因为IHttpController不继承IDisposable,而IHttpController的实现并不保证它自己的dispose逻辑.

public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
    var controller = (IHttpController) _kernel.Get(controllerType);
    request.RegisterForDispose( new Release(()=> _kernel.Release(controller)));
    return controller;
}

但后来我看到这样的事情并开始怀疑:

public IHttpController Create(
    HttpRequestMessage request,
    HttpControllerDescriptor controllerDescriptor,
    Type controllerType)
{
    if (controllerType == typeof(RootController))
    {
        var disposableQuery = new DisposableStatusQuery();
        request.RegisterForDispose(disposableQuery);
        return new RootController(disposableQuery);
    }
    return null;
}

在这个例子中,RootController在这里没有注册处理,大概是因为它是一个ApiController或MVC控制器? - 因此会自行处理.

DisposableStatusQuery的实例已注册处置,因为它是一个一次性对象,但为什么控制器不能处理实例本身?RootController具有disposableQuery(或者更确切地说,它的接口或抽象基础)的知识,因此会知道它是一次性的.

我什么时候才能真正需要使用HttpRequestMessage.RegisterForDispose?

sat*_*ish 0

我将 RegisterForDispose 与 DI 容器一起使用。根据博客文章,我已经实现在每次请求后处置容器(嵌套容器),以便它清除我创建的所有对象。