2013-06-25 5 views
7

का उपयोग कर सेवा में WebAPI UrlHelper इंजेक्ट करें मेरे पास मेरी वेबएपीआई परियोजना में कुछ नियंत्रकों द्वारा उपयोग की जाने वाली सेवा है। सेवा को यूआरएल उत्पन्न करने की जरूरत है, इसलिए आदर्श रूप से इसे UrlHelper एक कन्स्ट्रक्टर पैरामीटर के माध्यम से प्राप्त होगा।ऑटोफैक

public class MyService 
{ 
    public MyService(UrlHelper urlHelper) { ... } 
} 

मैं अपने आईओसी कंटेनर के रूप में ऑटोफैक का उपयोग कर रहा हूं। मैं कंटेनर में UrlHelper कैसे पंजीकृत कर सकता हूं? इसे HttpRequestMessage की आवश्यकता है और मैं यह नहीं समझ सकता कि "वर्तमान" संदेश कैसे प्राप्त करें।

+0

क्या हम WebAPIBook के लिए काम कर रहे हैं पर एक नजर डालें, तो यह एक संभव समाधान है इस समस्या के लिए ... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –

+0

आह, हाँ, बहुत अच्छा है। मैं इसे हल करने के लिए एक संदेश हैंडलर बनाने के बारे में सोच रहा था :) मैं इसे एक शॉट दूंगा। धन्यवाद। –

उत्तर

6

वर्तमान अनुरोध रजिस्टर करने के लिए उपयोग करें RegisterHttpRequestMessage विधि और फिर आप भी तो अपने URL सहायक रजिस्टर कर सकते हैं:

public static IContainer SetupContainer(HttpConfiguration config) 
{ 
    var containerBuilder = new ContainerBuilder(); 

    // Register your Web API. 
    containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
    containerBuilder.RegisterHttpRequestMessage(config); 
    containerBuilder.Register(x => new UrlHelper(x.Resolve<HttpRequestMessage>())); 
    containerBuilder.RegisterWebApiFilterProvider(config); 
    containerBuilder.RegisterWebApiModelBinderProvider(); 

    // Register your other types... 

    var container = containerBuilder.Build(); 

    // Set the dependency resolver to be Autofac. 
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

    return container; 
} 
+0

Autowiring एपीआई नियंत्रकों गुण RegisterHttpRequestMessage साथ काम नहीं करता था। यानी रजिस्टरएपी कंट्रोलर (असेंबली। गेटएक्सिंगिंगएस्परब्स())। PropertiesAutowired()। यदि आप इस कोड का उपयोग करते हैं, तो आप उचित वस्तुओं को स्वचालित करने का विकल्प खो देते हैं। – Mick

0

बेस्ट मैं के बारे में सोच सकते हैं आपकी सेवा इतना

public class MyService : IAutofacActionFilter 
    { 
     private UrlHelper _urlHelper; 

     public void DoSomething() 
     { 
      var link = Url.Link("SomeRoute", new {}); 
     } 

     private UrlHelper Url 
     { 
      get 
      { 
       if(_urlHelper == null) 
        throw new InvalidOperationException(); 

       return _urlHelper; 
      } 
     } 

     public void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext) 
     {    
     } 

     public void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
     { 
      this._urlHelper = actionContext.Request.GetUrlHelper(); 
     } 
    } 

तरह लागू IAutofacActionFilter और फिर निम्न निम्नलिखित Autofac config

builder.RegisterType<MyService>() 
       .AsWebApiActionFilterFor<SomeController>() 
       .AsSelf() 
       .InstancePerApiRequest(); 
4

डेरेल मिलर की टिप्पणी के आधार पर मैंने बनाया की तरह कुछ का उपयोग करना है :

एक साधारण कंटेनर क्लास "वर्तमान" 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 में इंजेक्ट किया जा सकता है।

सही दिशा में मुझे इंगित करने के लिए डैरल के लिए धन्यवाद।

+8

मैंने अभी Autofac.WebApi को HttpRequestMessage निर्भरता इंजेक्शन के लिए समर्थन जोड़ा है और इसे अगली रिलीज में शामिल किया जाएगा। https://code.google.com/p/autofac/source/detail?r=60d369499963b89224c1f682cfbf8592eae95342 –

+0

मैं RegisterHttpRequestMessage काम करने के लिए नहीं मिल सका लेकिन इस कोड काम – Mick

संबंधित मुद्दे