Ответ 1
Давайте отложим, почему у вас есть этот дизайн и сконцентрирован на проблеме: вводя IOwinContext
:
вы также можете получить его из экземпляра HttpRequestMessage
с помощью метода GetOwinContext
, однако вам также нужно как-то получить HttpRequestMessage
.
Unity не поддерживает инъекцию HttpRequestMessage
из коробки, но вы можете использовать пользовательский DelegatingHandler
, который хранит текущий HttpRequestMessage
в контейнере, как описано здесь: Ввести WebAPI UrlHelper в службу с помощью Autofac
Связанный вопрос касается Autofac, но вы можете перенести его для работы с Unity:
CurrentRequest
и CurrentRequestHandler
можно использовать из Andrew Davey, поскольку это:
public class CurrentRequest
{
public HttpRequestMessage Value { get; set; }
}
public class CurrentRequestHandler : DelegatingHandler
{
protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var scope = request.GetDependencyScope();
var currentRequest = (CurrentRequest)scope.GetService(typeof(CurrentRequest));
currentRequest.Value = request;
return await base.SendAsync(request, cancellationToken);
}
}
Тогда вам просто нужно зарегистрировать DelegatingHandler
с помощью:
httpConfiguration.MessageHandlers.Insert(0, new CurrentRequestHandler());
И зарегистрируйте CurrentRequest
и IOwinContext
в контейнере
container.RegisterType<CurrentRequest>(
new HierarchicalLifetimeManager());
container.RegisterType<IOwinContext>(
new HierarchicalLifetimeManager(),
new InjectionFactory(c => c.Resolve<CurrentRequest>().Value.GetOwinContext()));
httpConfiguration.DependencyResolver = new UnityHierarchicalDependencyResolver(container);
Помимо пользовательского обработчика делегирования есть другие места, которые можно подключить к Web.API для захвата HttpRequestMessage
, например, вы можете создать свой собственный IHttpControllerActivator
и использовать метод ExecuteAsync
, как описано здесь: Инъекция зависимостей в ASP.NET Web API 2