C# 关于如何实现条件依赖的建议?
我有两个类实现接口。这两个类都执行位置搜索功能。在这两个类构造函数中,根据类的不同,也有一个共同的功能 谷歌:IGoogleC# 关于如何实现条件依赖的建议?,c#,asp.net-mvc,asp.net-mvc-5,asp.net-web-api2,unity-container,C#,Asp.net Mvc,Asp.net Mvc 5,Asp.net Web Api2,Unity Container,我有两个类实现接口。这两个类都执行位置搜索功能。在这两个类构造函数中,根据类的不同,也有一个共同的功能 谷歌:IGoogle public NearBySearch(IWebPortalApiClient webPortalApiClient) { var serverString = ConfigHelper.GetAppSetting(ConfigConstants.APIServerType); var server = (WebPortalServ
public NearBySearch(IWebPortalApiClient webPortalApiClient)
{
var serverString = ConfigHelper.GetAppSetting(ConfigConstants.APIServerType);
var server = (WebPortalServer)Enum.Parse(typeof(WebPortalServer), serverString, true);
this._webPortalApiClient = webPortalApiClient;
this.GoogleKey = $"&key={ConfigHelper.GetAppSetting(ConfigConstants.Googlekey)}";
this._webPortalApiClient.Init(server);
}
艾尔普
public BusinessSearch(IWebPortalApiClient webPortalApiClient)
{
var serverString = ConfigHelper.GetAppSetting(ConfigConstants.APIServerType);
var server = (WebPortalServer)Enum.Parse(typeof(WebPortalServer), serverString, true);
this._webPortalApiClient = webPortalApiClient;
this._webPortalApiClient.AccessToken = ConfigHelper.GetAppSetting(ConfigConstants.YelpApiKey);
this._webPortalApiClient.Init(server, this._webPortalApiClient.AccessToken);
}
在谷歌的情况下,我们必须将密钥作为查询参数发送,而在Yelp中,我们必须将密钥作为授权头发送
在API控制器中,我将两者都注入
IGoogle
private IYelpController _yelpController;
private IGoogleController _googleController;
public PlaceSearchController(IYelpController yelpController, IGoogleController googleController)
{
this._yelpController = yelpController;
this._googleController = googleController;
}
我们在API中调用的函数如下
[HttpGet]
public async Task<IHttpActionResult> GetAllBusiness(int web, decimal latitude, decimal longitude, string radius = null)
{
try
{
if (web == (int)PlaceSearch.Yelp)
{
var result = await _yelpController.GetAllBusiness(latitude, longitude, radius);
var response = new Response<Common.Models.Yelp.Yelp>(ResponseConstants.Success, ResponseConstants.SuccessMessage, result);
return Ok(response);
}
else if(web == (int)PlaceSearch.Google)
{
if(radius == null)
{
throw new Exception();
}
var result = await _googleController.GetAllNearByPlaces(latitude, longitude, radius);
var response = new Response<Common.Models.Google.Google>(ResponseConstants.Success, ResponseConstants.SuccessMessage, result);
return Ok(response);
}
throw new Exception();
}
catch (Exception ex)
{
var response = new Response<Object>(ResponseConstants.Forbidden, ResponseConstants.FailureMessage, null);
return Ok(response);
}
}
当执行Yelp时,会传递令牌,这与预期的一样,但同时我们不会传递Google中的access token,它会将access token设置为null
由于这个问题,我无法调用YelpAPI,因为它找不到访问令牌
有没有一种方法可以在条件的基础上注入依赖关系。我们正在为此使用Unity容器
门户网站客户端
public class WebPortalApiClient : IWebPortalApiClient
{
public WebPortalServer WebPortalServer { get; set; }
public string AccessToken { get; set; }
private string ServerUrl
{
get
{
switch (WebPortalServer)
{
case WebPortalServer.Dev:
return null;
case WebPortalServer.QA:
return null;
case WebPortalServer.Demo:
return null;
case WebPortalServer.Production:
return null;
case WebPortalServer.Localhost:
return "http://localhost:63695/";
case WebPortalServer.Integration:
return null;
case WebPortalServer.UAT:
return null;
default:
throw new ArgumentOutOfRangeException();
}
}
}
public async Task<HttpContent> InvokeApi(string path, HttpAction action, HttpContent content = null, TimeSpan? overrideTimeout = null, string externalServer = null)
{
var sUrl = externalServer == null ? ServerUrl : externalServer;
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(sUrl);
if (overrideTimeout.HasValue)
{
client.Timeout = overrideTimeout.Value;
}
//this.Log("Connecting to {0} Api at {1}".Fmt(WebPortalServer, ServerUrl));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", AccessToken);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response;
switch (action)
{
case HttpAction.Get:
response = await client.GetAsync(path);
break;
case HttpAction.Post:
response = await client.PostAsync(path, content);
break;
case HttpAction.Put:
response = await client.PutAsync(path, content);
break;
case HttpAction.Delete:
response = await client.DeleteAsync(path);
break;
default:
throw new ArgumentOutOfRangeException("action", action, null);
}
return response.IsSuccessStatusCode ? response.Content : null;
}
}
public IWebPortalApiClient Init(WebPortalServer server, string accessToken = null)
{
WebPortalServer = server;
AccessToken = accessToken;
return this;
}
}
公共类WebPortalApiClient:IWebPortalApiClient
{
公共WebPortalServer WebPortalServer{get;set;}
公共字符串AccessToken{get;set;}
私有字符串服务器URL
{
得到
{
交换机(WebPortalServer)
{
案例WebPortalServer.Dev:
返回null;
案例WebPortalServer.QA:
返回null;
案例WebPortalServer.Demo:
返回null;
案例WebPortalServer.Production:
返回null;
案例WebPortalServer.Localhost:
返回“http://localhost:63695/";
案例WebPortalServer.Integration:
返回null;
案例WebPortalServer.UAT:
返回null;
违约:
抛出新ArgumentOutOfRangeException();
}
}
}
公共异步任务InvokeApi(字符串路径,HttpAction操作,HttpContent=null,TimeSpan?overrideTimeout=null,字符串externalServer=null)
{
var sUrl=externalServer==null?服务器URL:externalServer;
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(sUrl);
if(overrideTimeout.HasValue)
{
client.Timeout=overrideTimeout.Value;
}
//这个.Log(“连接到{1}.Fmt(WebPortalServer,ServerUrl)上的{0}Api”);
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“承载者”,AccessToken);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage响应;
开关(动作)
{
案例HttpAction.Get:
response=wait client.GetAsync(路径);
打破
案例HttpAction.Post:
response=wait client.PostAsync(路径、内容);
打破
案例HttpAction.Put:
response=wait client.PutAsync(路径、内容);
打破
案例HttpAction.Delete:
response=wait client.deleteAync(路径);
打破
违约:
抛出新ArgumentOutOfRangeException(“action”,action,null);
}
return response.IsSuccessStatusCode?response.内容:空;
}
}
公共IWebPortalApiClient Init(WebPortalServer服务器,字符串accessToken=null)
{
WebPortalServer=服务器;
AccessToken=AccessToken;
归还这个;
}
}
如果没有它,包括您的Unity注册,您很难看到如何为您的两个类创建一个iWebPortalaPicClient
。。。可能有人将它设置为每个请求,而不是每个调用。。。或者其他一些生命周期不匹配。@AlexeiLevenkov添加了Web门户客户端类代码,如果没有这些代码,包括您的Unity注册,则很难看到您如何为您的两个类创建一个IWebPortalApiClient
实例。。。可能有人将它设置为每个请求,而不是每个调用。。。或者其他一些生命周期不匹配。@AlexeiLevenkov添加了Web门户客户端类代码
public class WebPortalApiClient : IWebPortalApiClient
{
public WebPortalServer WebPortalServer { get; set; }
public string AccessToken { get; set; }
private string ServerUrl
{
get
{
switch (WebPortalServer)
{
case WebPortalServer.Dev:
return null;
case WebPortalServer.QA:
return null;
case WebPortalServer.Demo:
return null;
case WebPortalServer.Production:
return null;
case WebPortalServer.Localhost:
return "http://localhost:63695/";
case WebPortalServer.Integration:
return null;
case WebPortalServer.UAT:
return null;
default:
throw new ArgumentOutOfRangeException();
}
}
}
public async Task<HttpContent> InvokeApi(string path, HttpAction action, HttpContent content = null, TimeSpan? overrideTimeout = null, string externalServer = null)
{
var sUrl = externalServer == null ? ServerUrl : externalServer;
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(sUrl);
if (overrideTimeout.HasValue)
{
client.Timeout = overrideTimeout.Value;
}
//this.Log("Connecting to {0} Api at {1}".Fmt(WebPortalServer, ServerUrl));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", AccessToken);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response;
switch (action)
{
case HttpAction.Get:
response = await client.GetAsync(path);
break;
case HttpAction.Post:
response = await client.PostAsync(path, content);
break;
case HttpAction.Put:
response = await client.PutAsync(path, content);
break;
case HttpAction.Delete:
response = await client.DeleteAsync(path);
break;
default:
throw new ArgumentOutOfRangeException("action", action, null);
}
return response.IsSuccessStatusCode ? response.Content : null;
}
}
public IWebPortalApiClient Init(WebPortalServer server, string accessToken = null)
{
WebPortalServer = server;
AccessToken = accessToken;
return this;
}
}