КонтроллерПравильно установить Scope при использовании 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>());
}
}
По первому требованию Получить() действия, Handler конкретизируется путем SimpleInjector и выполняется правильно.
На втором запросе (F5 в браузере, например), он терпит неудачу с:
Обработчик не был найден для запроса типа ....
Контейнер или служба поиска не настроен должным образом или обработчиков, не зарегистрированных в вашем контейнере.
и внутреннее исключение:
Не удается получить доступ к объекту, расположенный.
Название объекта: «Объект ThreadLocal был удален».
Owin Startup
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);
}
}
Я думаю, что это правильно создан Handler, что происходит, а затем утилизировать после первого запроса. Теперь я не знаю почему, но при последующих запросах обработчик не воссоздается. Я знаю это, потому что, если я изменю WebApiRequestLifestyle к «не выбрасывайте, когда сфера заканчивается», он работает для каждого запроса:
c.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle(false
/*disposeInstanceWhenScopeEnds*/);
Вопросы
- Должен ли я сохранить параметр
disposeInstanceWhenScopeEnds
значение ЛОЖЬ? - Если нет, то каково правильное решение?
- Я вижу, что это было solved before by creating a LifetimeScopeDecorator ... однако, эта функциональность уже предоставлена библиотекой интеграции SimpleInjector WebApi? Что мне не хватает?
(И спасибо за чтение)
Пожалуйста, добавьте соответствующие трассировки стека, – Steven