Dựa trên nhận xét Darrel Miller, tôi đã tạo ra sau :
Lớp chứa đơn giản để giữ tham chiếu đến "hiện tại" HttpRequestMessage
public class CurrentRequest
{
public HttpRequestMessage Value { get; set; }
}
Một handler thông điệp rằng sẽ lưu trữ các yêu cầu hiện tại
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);
}
}
Trong Global.asax, khi cấu hình WebAPI, thêm xử lý tin nhắn.
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
Sau đó, cấu hình container Autofac để cho nó xây dựng UrlHelper
, nhận được yêu cầu hiện tại từ đối tượng 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
sau đó có thể được tiêm vào MyService
giống như bất kỳ phụ thuộc khác.
Nhờ Darrel đã chỉ cho tôi đúng hướng.
Nguồn
2013-06-25 14:49:52
Hãy nhìn vào những gì chúng tôi đã làm việc trên cho WebAPIBook, nó có một giải pháp khả thi cho vấn đề này ... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –
Ah, vâng, rất hay. Tôi đã suy nghĩ về việc tạo ra một trình xử lý tin nhắn để giải quyết điều này :) Tôi sẽ cung cấp cho nó một shot. Cảm ơn. –