控制器
public class LocationsController : ApiController
{
private readonly IMediator _mediator;
public LocationsController(IMediator mediator)
{
_mediator = mediator;
}
public IEnumerable<Place> Get()
{
return _mediator.Send(new GetLatestMapData<Place>());
}
}
在 Get() 操作的第一次请求中,处理程序由 SimpleInjector 实例化并正确执行。
在第二个请求中(例如浏览器中的 F5),它失败并显示:
未找到类型请求的处理程序 ....
容器或服务定位器未正确配置或处理程序未在您的容器中注册。
和内部例外:
无法访问已处置的对象。
对象名称:'ThreadLocal 对象已被释放。'
欧文启动
public class Startup
{
public void Configuration(IAppBuilder app)
{
// SimpleInjector
var container = CompositionRoot.CreateContainer();
var config = GlobalConfiguration.Configuration;
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
// Routing
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}",
new { id = RouteParameter.Optional });
config.EnsureInitialized();
app.UseWebApi(config);
}
}
WebAPI 项目的 SimpleInjector IPackage
public class Installer : IPackage
{
public void RegisterServices(Container c)
{
c.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
c.RegisterWebApiControllers(GlobalConfiguration.Configuration);
}
}
我认为正在发生的事情是正确创建了处理程序,然后在第一次请求后处置。现在,我不知道为什么,但是在后续请求中,不会重新创建处理程序。我知道这一点,因为如果我将 WebApiRequestLifestyle 更改为“范围结束时不处理”,它适用于每个请求:
c.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(false
/*disposeInstanceWhenScopeEnds*/);
问题
- 我应该将
disposeInstanceWhenScopeEnds
参数设置为 false 吗? - 如果不是,正确的解决方案是什么?
- 我看到这已经通过创建 LifetimeScopeDecorator 解决了......但是,这个功能肯定已经由 SimpleInjector WebApi 集成库提供了吗?我错过了什么?
(感谢您的阅读)