使用HttpSelfHostServer时未调用RegisterForDispose

时间:2014-12-23 07:15:22

标签: c# .net asp.net-web-api dependency-injection

我正在实现一个自定义IHttpControllerActivator,使用Pure DI来管理我的控制器的依赖项。

我要向release方法提供RegisterForDispose我的依赖项Release适配器。

(这种策略是众所周知的,并记录在案here)。

public class CompositionRoot : IHttpControllerActivator
{    
    public IHttpController Create(
        HttpRequestMessage request,
        HttpControllerDescriptor controllerDescriptor,
        Type controllerType)
    {
        // I removed the Raven IDocumentStore singleton code brevity
        IDocumentSession session = ...

        request.RegisterForDispose(new Release(() =>
        {
            // When the request is over, commit the UoW and clean up.
            session.SaveChanges();
            session.Dispose();
        }));

        var controller = new PollController(session);
        return controller;
    }

    private class Release : IDisposable
    {
        private readonly Action _release;

        public Release(Action release)
        {
            _release = release;
        }

        public void Dispose()
        {
            _release.Invoke();
        }
    }
}

当我通过Visual Studio运行此应用程序并使用Fiddler与API交互时,调用Dispose方法并且一切正常。

但是,当我为了边界测试而使用HttpSelfHostServer运行此应用程序时,永远不会调用Dispose方法,因此永远不会调用SaveChanges - 这会导致迫在眉睫的问题

可能是因为没有调用DisposeRequestResources方法吗?我找到了这个issue,但此后一直关闭。

在我的边界测试项目中,我使用以下工厂方法来创建HttpClient

public static HttpClient Create()
{
    var baseAddress = new Uri("http://localhost:43594");
    var config = new HttpSelfHostConfiguration(baseAddress);
    new Bootstrap().Configure(config);
    var server = new HttpSelfHostServer(config);

    var client = new HttpClient(server);
    try
    {
        client.BaseAddress = baseAddress;
        return client;
    }
    catch
    {
        client.Dispose();
        throw;
    }
}
然后,我向服务器发出请求并对响应进行断言。

如何在使用HttpSelfHostServer时确保释放依赖关系?

0 个答案:

没有答案