C# 关于如何实现条件依赖的建议?

C# 关于如何实现条件依赖的建议?,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

我有两个类实现接口。这两个类都执行位置搜索功能。在这两个类构造函数中,根据类的不同,也有一个共同的功能

谷歌:IGoogle

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