繁体   English   中英

在ASP.NET MVC中管理对第三方应用程序的共享API调用的最佳场所

[英]Best Place to manage shared API calls to 3rd party application inside my asp.net mvc

我正在开发MVC 5 Web应用程序。 我有以下几层:

  1. 观看次数
  2. 控制器类。
  3. 仓库类,在控制器类中被引用。
  4. 模型分类
  5. 实体框架数据库上下文。

现在我有以下要求:

在某些操作方法中,我希望我的应用程序向第三方应用程序发送一些API调用(使用WebClient() )。

除了Description参数之外,所有动作方法的API调用几乎都将在此位置。 现在,我可以在存储库类中拥有此共享逻辑,并从我的操作方法中引用它。 但据我所知,存储库类不应公开或引用WebClient()或类似的Web类,因为存储库应仅处理数据库和模型类。 因此,我不确定管理共享的WebClient呼叫的最佳位置是什么? 所以从动作方法中,我仅调用共享类并传递描述字段?

例如,以下是直接包含Web客户端的操作方法示例:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Server s)
{
    if (ModelState.IsValid)
    {
        try
        {
            //code goes here....

            XmlDocument doc = new XmlDocument();
            using (var client = new WebClient())
            {
                var query = HttpUtility.ParseQueryString(string.Empty);
                query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"];
                query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"];
                query["assetType"] = controllername;
                query["operation"] = "UpdateAsset";
                query["assetName"] = s.RESOURCENAME;
                query["description"] = s.DESCRIPTION;
                //code goes here
                var url = new UriBuilder(apiurl);
                url.Query = query.ToString();
                try
                {
                    string xml = client.DownloadString(url.ToString());
                    doc.LoadXml(xml);
                    updatestatus = doc.SelectSingleNode("/operation/operationstatus").InnerText;
                }
                catch (WebException ex)
                {
                    ModelState.AddModelError(string.Empty, "Error occurred:" + ex.InnerException.Message);
                }
            }
        }
    }
}

现在,我不想在多个操作方法上添加相同的WebClient方法,而希望在共享类上具有WebClient(),并从相关的操作方法中引用它。

代码示例将有所帮助,但总的来说,我认为您在这里是正确的。

但据我所知,存储库类不应公开或引用WebClient()或类似的Web类,因为存储库应仅处理数据库和模型类

这不仅仅是关于数据库。 我的感觉是存储库处理“数据源”,而外部服务则属于此。 对此没有绝对的规则。 在您的情况下,什么有意义?

因此,我不确定管理共享的WebClient呼叫的最佳位置是什么?

我认为存储库很好。 根据您的体系结构,它还适合什么地方? 您始终可以添加一个WebApi,但它可能不会增加任何价值,而只是使事情复杂化。

所以从动作方法中,我仅调用共享类并传递描述字段?

对我来说似乎是一个计划。 您还可以跳过控制器/操作方法调用,并通过ajax调用直接从视图转到服务

您可以创建一个操作过滤器来管理此API调用...,因此您无需使用此代码来污染您的操作即可调用其他类。

如果该描述在每个动作中都是静态的,则您甚至可以将其放入装饰器中。

[Httppost]
[ValidateAntiForgeryToken]
[MyApiFilter(Description="theDescription")]
public ActionResult Create(Server s)
{
    //Your action code
}

如果无法将描述放置在装饰器中,并且需要更多动态信息,则可以在操作代码中设置一些参数,以在运行时由过滤器获取。

[Httppost]
[ValidateAntiForgeryToken]
[MyApiFilter]
public ActionResult Create(Server s)
{
    //Your action code

    this.SetAdditionalInfo(myDescription)
}

在您的BaseController中

public void SetAdditionalInfo(string description)
{
    this.APICallDescription = description;
}

基本的ActionFilterAttribute类具有以下可以覆盖的方法:

OnActionExecuting –执行控制器操作之前,将调用此方法。

OnActionExecuted –执行控制器动作后调用此方法。

OnResultExecuting –在执行控制器动作结果之前调用此方法。

OnResultExecuted –执行控制器动作结果后调用此方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM