Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 带有Autofac for Web API的HttpClient包装器_C# 4.0_.net 4.5_Autofac_Asp.net Web Api2_Dotnet Httpclient - Fatal编程技术网

C# 4.0 带有Autofac for Web API的HttpClient包装器

C# 4.0 带有Autofac for Web API的HttpClient包装器,c#-4.0,.net-4.5,autofac,asp.net-web-api2,dotnet-httpclient,C# 4.0,.net 4.5,Autofac,Asp.net Web Api2,Dotnet Httpclient,我继承了一个存根项目,它是特定于我们维护的API enpoint的HttpClient包装器。 其目的是将此解决方案作为nuget分发给需要使用API端点的其他.NET团队 将Autofac连线视为以下模块-我的问题是消费者是否会这样做: var client = PlayersAPIHttpClientModule("http:/api.players.com"); 此设置如何帮助使用者传递基本URI,然后访问GetPlayerInformation方法 using Autofac; usi

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

将Autofac连线视为以下模块-我的问题是消费者是否会这样做:

var client = PlayersAPIHttpClientModule("http:/api.players.com");
此设置如何帮助使用者传递基本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>();
        }
    }
}   
这就是具有公开方法功能的类本身

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;
    }
}
如以下文件所述:

模块是一个小型类,可用于捆绑一组 “门面”后面的相关组件,以简化配置和 部署。模块公开了一组经过深思熟虑的、受限的 可以独立于组件而变化的配置参数 用于实现该模块

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

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

就代码库而言,
playerApiHttpClientModule
正在将
PlayerDomainManager
配置为实现
IPlayerDomainManager
的服务,并将其生存期配置为充当单例。其好处是,该模块允许PlayerDomainManager的深层配置需求(基础服务url,而基础服务url又是它的一个依赖项所需要的)以集中到模块构造函数的配置形式出现。如果配置更复杂,这种好处会更明显

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

builder.RegisterModule(新的PlayersAPIHttpClientModule(“基本服务url”);

反过来,它们配置的服务将使用标准的AutoFac依赖项解析进行解析

scope.Resolve();

因此,为了回答您的问题,您不会按照您的问题使用PlayersAPIHttpClientModule

  • 使用AutoFac
    ContainerBuilder注册播放器ApiHttpClientModule
  • 根据需要,使用AutoFac
    容器
    解析
    IDomainPlayerManager
  • 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;
        }
    }