控制器使用的WebAPI,SimpleInjector和MediatR
public class LocationsController : ApiController
{
private readonly IMediator _mediator;
public LocationsController(IMediator mediator)
{
_mediator = mediator;
}
public IEnumerable<Place> Get()
{
return _mediator.Send(new GetLatestMapData<Place>());
}
}
在获取()动作的第一请求时,正确设定范围内,所述处理程序被实例化SimpleInjector和正确执行。
在第二请求(F5在浏览器为例如),它失败:
处理程序未找到类型的请求....
集装箱或服务定位器不正确配置或处理程序未注册您的容器。
内部异常的和:
无法访问已释放的对象。
对象名称:'ThreadLocal对象已被处置。
OWIN启动
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);
}
}
SimpleInjector IPackage为的WebAPI项目
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? - 如果不是,那么正确的解决方案是什么?
- 我看到这已经是solved before by creating a LifetimeScopeDecorator ...但是,当然这个功能已经由SimpleInjector WebApi集成库提供了吗?我错过了什么?
(谢谢你的阅读)
请添加相应的堆栈跟踪, – Steven