带有Autofac for Web API的HttpClient包装器

Gil*_*lla 5 autofac c#-4.0 .net-4.5 dotnet-httpclient asp.net-web-api2

我继承了一个存根项目,它是一个HttpClient包装器,专门用于我们维护的API连接点.目的是将此解决方案作为nuget分发给需要使用API​​端点的其他.NET团队.

将Autofac电线连接看作下面的模块 - 我的问题是消费者会这样做:

var client = PlayersAPIHttpClientModule("http:/api.players.com");
Run Code Online (Sandbox Code Playgroud)

这个设置如何帮助消费者传递基URI然后访问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>();
        }
    }
}   
Run Code Online (Sandbox Code Playgroud)

这是与核心域共享的接口.

public interface IPlayerDomainManager
{
    IPlayer GetPlayerInformation (string playerId);
}
Run Code Online (Sandbox Code Playgroud)

这是具有公开方法功能的类本身.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ton 12

如AutoFac模块文档中所述:

模块是一个小类,可用于在"Facade"后面捆绑一组相关组件,以简化配置和部署.该模块公开了一组有意的,受限制的配置参数,这些参数可以独立于用于实现模块的组件而变化.

根据文档中描述的模块的常见用例,常见的用例是:

配置提供子系统的相关服务,例如使用NHibernate进行数据访问

对于您的代码库,PlayersAPIHttpClientModule正在将PlayerDomainManager服务配置为实现IPlayerDomainManager并将其生命周期配置为充当单例的服务.好处是模块允许将PlayerDomainManager(其依赖性之一所需的基本服务URL)的深度隐藏配置要求作为集成到模块构造函数的配置浮出水面.如果配置更复杂,这种好处将更加明显.

模块需要根据任何其他依赖项向AutoFac注册:

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

反过来,他们配置的服务使用标准的AutoFac依赖性解析来解决.

scope.Resolve<IDomainPlayerManager>();

所以,为了回答你的问题,你不会根据你的问题使用PlayersAPIHttpClientModule.

  1. 注册PlayersAPIHttpClientModuleAutoFacContainerBuilder
  2. 使用AutoFac Container解决IDomainPlayerManager所需的问题