डेरेल मिलर की टिप्पणी के आधार पर मैंने बनाया की तरह कुछ का उपयोग करना है :
एक साधारण कंटेनर क्लास "वर्तमान" 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, में संग्रहीत करेगा संदेश हैंडलर जोड़ने।
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler());
फिर, यह UrlHelper
निर्माण, CurrentRequest
वस्तु से वर्तमान अनुरोध हो रही यह बताने के लिए Autofac कंटेनर कॉन्फ़िगर करें।
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
में इंजेक्ट किया जा सकता है।
सही दिशा में मुझे इंगित करने के लिए डैरल के लिए धन्यवाद।
स्रोत
2013-06-25 14:49:52
क्या हम WebAPIBook के लिए काम कर रहे हैं पर एक नजर डालें, तो यह एक संभव समाधान है इस समस्या के लिए ... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –
आह, हाँ, बहुत अच्छा है। मैं इसे हल करने के लिए एक संदेश हैंडलर बनाने के बारे में सोच रहा था :) मैं इसे एक शॉट दूंगा। धन्यवाद। –