我正在实现一个自定义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
时确保释放依赖关系?