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
模块是一个小类,可用于在"Facade"后面捆绑一组相关组件,以简化配置和部署.该模块公开了一组有意的,受限制的配置参数,这些参数可以独立于用于实现模块的组件而变化.
根据文档中描述的模块的常见用例,常见的用例是:
配置提供子系统的相关服务,例如使用NHibernate进行数据访问
对于您的代码库,PlayersAPIHttpClientModule正在将PlayerDomainManager服务配置为实现IPlayerDomainManager并将其生命周期配置为充当单例的服务.好处是模块允许将PlayerDomainManager(其依赖性之一所需的基本服务URL)的深度隐藏配置要求作为集成到模块构造函数的配置浮出水面.如果配置更复杂,这种好处将更加明显.
模块需要根据任何其他依赖项向AutoFac注册:
builder.RegisterModule(new PlayersAPIHttpClientModule("base_service_url));
反过来,他们配置的服务使用标准的AutoFac依赖性解析来解决.
scope.Resolve<IDomainPlayerManager>();
所以,为了回答你的问题,你不会根据你的问题使用PlayersAPIHttpClientModule.
PlayersAPIHttpClientModuleAutoFacContainerBuilderContainer解决IDomainPlayerManager所需的问题| 归档时间: |
|
| 查看次数: |
2601 次 |
| 最近记录: |