コントローラ
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() アクションの最初の要求で、Handler は SimpleInjector によってインスタンス化され、正しく実行されます。
2 番目のリクエスト (ブラウザで 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);
}
}
WebAPI プロジェクトの SimpleInjector IPackage
public class Installer : IPackage
{
public void RegisterServices(Container c)
{
c.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
c.RegisterWebApiControllers(GlobalConfiguration.Configuration);
}
}
ハンドラーが正しく作成され、最初のリクエストの後に破棄されていると思います。理由はわかりませんが、後続のリクエストで Handler が再作成されません。WebApiRequestLifestyle を「スコープの終了時に破棄しない」に変更すると、すべてのリクエストで機能するため、これを知っています。
c.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(false
/*disposeInstanceWhenScopeEnds*/);
質問
disposeInstanceWhenScopeEnds
パラメータを false に設定しておく必要がありますか?- そうでない場合、正しい解決策は何ですか?
- これはLifetimeScopeDecorator を作成することで以前に解決されているようですが、この機能は SimpleInjector WebApi 統合ライブラリによって既に提供されているのでしょうか? 私は何が欠けていますか?
(そして読んでくれてありがとう)