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