2014-07-16 11 views
5

Ho ereditato un progetto stub che è un wrapper HttpClient specifico per un enpoint API che manteniamo. L'intenzione è quella di distribuire questa soluzione come nuget ad altri team .NET che avrebbero bisogno di utilizzare l'endpoint dell'API.HttpClient wrapper con Autofac per Web API

Guardando l'Autofac filo-up come un modulo di seguito - la mia domanda è sarebbe il consumatore fare questo:

var client = PlayersAPIHttpClientModule("http:/api.players.com"); 

Come funziona questa configurazione facilita il consumatore a passare l'URI di base e quindi accedere al metodo GetPlayerInformation ?

using Autofac; 
using AutoMapper; 
using Alpha.Domain.Players; 
using System.Net.Http; 

namespace Alpha.Clients.Players 
{ 
    public class PlayersAPIHttpClientModule : Module 
    { 
     private readonly string _serviceBaseUrl; 

     public PlayersAPIHttpClientModule(string serviceBaseUrl) 
     { 
      this._serviceBaseUrl = serviceBaseUrl; 
     } 

     protected override void Load(ContainerBuilder builder) 
     { 
      base.Load(builder); 

      builder.Register(ctx => 
      { 
       var serviceClient = new HttpClient 
       { 
        BaseAddress = 
        new System.Uri(this._serviceBaseUrl) 
       }; 

       return new 
       PlayerDomainManager(serviceClient, 
            ctx.Resolve<IMappingEngine>()); 
      }) 
       .SingleInstance() 
       .As<IPlayerDomainManager>(); 
     } 
    } 
} 

Questa è l'interfaccia condivisa con il dominio di nucleo.

public interface IPlayerDomainManager 
{ 
    IPlayer GetPlayerInformation (string playerId); 
} 

e questa è la classe stessa con la funzionalità metodo esposto.

internal class PlayerDomainManager : IPlayerDomainManager 
{ 
    private readonly HttpClient _client; 

    private readonly IMappingEngine _mapper; 

    public PlayerDomainManager(HttpClient client, IMappingEngine mapper) 
    { 
     this._client = client; 
     this._mapper = mapper; 
    } 

    public IPlayer GetPlayerInformation(string playerId) 
    { 
     var response = this._client 
         .SendAsync 
          (new 
          HttpRequestMessage(HttpMethod.Get, 
          "/players/" + playerId), 
          CancellationToken.None) 
          .Result; 
    } 
} 

risposta

12

Come descritto nella AutoFac Module documentation: Un modulo

è una piccola classe che può essere utilizzato per impacchettare un insieme di componenti collegati dietro una 'facciata' per semplificare la configurazione e distribuzione . Il modulo espone un set deliberato e limitato di parametri di configurazione che può variare indipendentemente dai componenti utilizzati per implementare il modulo.

Come per i casi d'uso comune di moduli, come descritto nella documentazione, un caso d'uso comune è quello di:

servizi connessi Configurare che forniscono un sottosistema, per esempio l'accesso ai dati con NHibernate

Nel caso della base di codice, il PlayersAPIHttpClientModule è la configurazione del PlayerDomainManager come un servizio che implementa il IPlayerDomainManager e la configurazione suo ciclo di vita di agire come un Singleton. Il vantaggio è che il modulo consente il requisito di configurazione profondamente sepolto di PlayerDomainManager (l'URL del servizio di base che a sua volta è richiesto da una delle sue dipendenze) da emettere come configurazione centralizzata al costruttore di moduli. Questo vantaggio sarebbe più ovvio se la configurazione fosse più complessa.

I moduli devono essere registrati con autofac come per qualsiasi altra dipendenza:

builder.RegisterModule(new PlayersAPIHttpClientModule("base_service_url));

A loro volta, i servizi che configurano vengono risolti utilizzando standard di risoluzione delle dipendenze autofac.

scope.Resolve<IDomainPlayerManager>();

Quindi, per rispondere alla tua domanda, non si sarebbe non utilizzare il PlayersAPIHttpClientModule secondo la vostra domanda.

  1. registrare il PlayersAPIHttpClientModule con all'autofac ContainerBuilder
  2. Usa all'autofac Container per risolvere il IDomainPlayerManager come richiesto