控制器使用的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