2013-06-25 18 views
7

kullanarak hizmete sokma WebAPI projemde birkaç denetleyici tarafından kullanılan bir hizmet var. Hizmetin URL oluşturması gerekiyor, bu yüzden ideal olarak bir kurucu parametresi aracılığıyla UrlHelper elde edilir.WebAPI UrlHelper'ı Autofac

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

Autofac ürününü IoC kapsayıcı olarak kullanıyorum. Konteynerde UrlHelper kaydını nasıl kaydedebilirim? HttpRequestMessage'a ihtiyacı var ve "geçerli" mesajı nasıl alacağımı anlayamıyorum.

+0

biz WebAPIBook üzerinde çalıştığımız ne bir göz atın, bu olası bir çözümü vardır Bu soruna ... https://gist.github.com/glennblock/8f18bdee15eec9c1af70 –

+0

Ah, evet, çok güzel. Bunu çözmek için bir mesaj işleyicisi oluşturmayı düşünüyordum :) Bir şans vereceğim. Teşekkürler. –

cevap

6

akım istek kaydetmek için RegisterHttpRequestMessage yöntemi kullanın ve sonra da şöyle URL yardımcı kayıt olabilirsiniz:

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

yaptılar RegisterHttpRequestMessage işe alamadı. diğer bir deyişle RegisterApiControllers (Assembly.GetExecutingAssembly()) PropertiesAutowired(). Bu kodu kullanırsanız, uygun özellikleri otomatik olarak iptal etme seçeneğini kaybedersiniz. – Mick

0

aklıma gelen en iyi servis böylece

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(); 
     } 
    } 

gibi IAutofacActionFilter uygulamak ve daha sonra Darrel Miller yorum dayanarak

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

, benim yarattığım şu Autofac yapılandırma gibi aşağıdaki şey kullanın yapmak olduğunu :

basit bir konteyner sınıfı "geçerli" bir referans HttpRequestMessage

tutmak için WebAPI yapılandırırken akım isteği Global.asax, içinde

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); 
    } 
} 

depolayacak

public class CurrentRequest 
{ 
    public HttpRequestMessage Value { get; set; } 
} 

bir ileti işleyicisi, ileti işleyicisi ekleyin.

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CurrentRequestHandler()); 

Ardından, CurrentRequest nesneden Mevcut isteği alma, UrlHelper inşa izin Autofac kabı yapılandırın.
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

sonra tıpkı diğer bağımlılık gibi MyService içine enjekte edilebilir.

Darrel'i bana doğru yönde işaret ettiğin için sağol.

+8

Sadece Autofac.WebApi'ye HttpRequestMessage bağımlılık enjeksiyonu desteği ekledim ve bir sonraki sürümde yer alacak. https://code.google.com/p/autofac/source/detail?r=60d369499963b89224c1f682cfbf8592eae95342 –

+0

Ben ancak bu kod RegisterHttpRequestMessage ile çalışmıyor api kontrolörleri özelliklerini Autowiring iş – Mick