podstawie komentarzu Darrel Millera, stworzyłem następujące :
Prosta klasa kontenerów przechowująca odwołanie do "bieżącego" HttpRequestMessage
public class CurrentRequest
{
public HttpRequestMessage Value { get; set; }
}
Procedura obsługi wiadomości, która będzie przechowywać bieżącego żądania
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);
}
}
W Global.asax, podczas konfigurowania WebAPI, dodaj obsługi wiadomości.
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
Następnie należy skonfigurować pojemnik Autofac pozwolić mu zbudować UrlHelper
, uzyskanie bieżącego żądania od obiektu CurrentRequest
.
var builder = new ContainerBuilder();
builder.RegisterType<CurrentRequest>().InstancePerApiRequest();
builder.Register(c => new UrlHelper(c.Resolve<CurrentRequest>().Value));
builder.RegisterType<MyService>();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
...
container = builder.Build();
UrlHelper
można następnie wstrzykiwane do MyService
tak jak każde inne uzależnienie.
Dziękuję Darrel za skierowanie mnie we właściwym kierunku.
spojrzeć na to, co pracują na dla WebAPIBook, ma jedno możliwe rozwiązanie do tego problemu ... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –
Ah, tak, bardzo miło. Myślałem o stworzeniu programu do obsługi wiadomości, aby rozwiązać ten problem. Postaram się go zrobić. Dzięki. –