基于达雷尔 - 米勒的评论,我创建了以下:
一个简单的容器类,用于保存对“当前”HttpRequestMessage的引用
public class CurrentRequest
{
public HttpRequestMessage Value { get; set; }
}
配置的WebAPI时将存储当前请求
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中,消息处理程序,添加消息处理程序。
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
然后,配置Autofac容器让它构造UrlHelper
,渐渐从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
就像任何其他的依赖。
感谢Darrel将我指向正确的方向。
看看我们一直在努力为WebAPIBook,它有一个可能的解决方案对这个问题... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –
啊,是的,非常好。我正在考虑创建一个消息处理程序来解决这个问题:)我会给它一个镜头。谢谢。 –