Darrel Miller のコメントに基づいて、以下を作成しました。
「現在の」HttpRequestMessage への参照を保持する単純なコンテナ クラス
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);
}
}
Global.asax で、WebAPI を構成するときに、メッセージ ハンドラーを追加します。
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
UrlHelper
次に、オブジェクトから現在のリクエストを取得して、 を構築できるように Autofac コンテナーを構成し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
MyService
その後、他の依存関係と同じように に注入できます。
私を正しい方向に向けてくれたダレルに感謝します。