コントローラ正しく設定範囲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によってインスタンス化され、正しく実行されます。第2の要求(例えばためのブラウザでF5)で
、それはで失敗:
ハンドラタイプの要求のために見つかりませんでした....
容器またはサービスロケータ正しく構成かあなたのコンテナに登録されていないハンドラ
と内部例外:
が配置されたオブジェクトにアクセスすることはできません。
オブジェクト名: 'ThreadLocalオブジェクトが破棄されました。' WebAPIのプロジェクトのための
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は
public class Installer : IPackage
{
public void RegisterServices(Container c)
{
c.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
c.RegisterWebApiControllers(GlobalConfiguration.Configuration);
}
}
私はハンドラが正しく作成されている何が起こっているかと思いますし、最初の要求の後に配置されました。 ここで、理由はわかりませんが、その後のリクエストでは、ハンドラは再作成されません。
c.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(false
/*disposeInstanceWhenScopeEnds*/);
質問を
- 私はfalseに設定
disposeInstanceWhenScopeEnds
パラメータを維持する必要があります:私は「スコープが終了したときに処分しない」にWebApiRequestLifestyleを変更した場合、それはすべての要求のために働くので、私はこれを知っていますか? - そうでない場合、正しい解決策は何ですか?
- これはsolved before by creating a LifetimeScopeDecoratorでしたが、確かにこの機能は既にSimpleInjector WebApi統合ライブラリによって提供されていますか?私は何が欠けていますか?
(そして、お読みいただきありがとうございました)
詳細
を適切なスタックトレースを追加してください、 – Steven