在我的 asp.net MVC 中管理对第三方应用程序的共享 API 调用的最佳位置
本文关键字:应用程序 共享 API 最佳位置 调用 第三方 asp 我的 net MVC 管理 | 更新日期: 2023-09-27 18:36:46
我正在开发MVC 5 Web应用程序。我有以下几层:-
- 视图
- 控制器类。
- 存储库类,在控制器类中引用。
- 模型分类
- 实体框架数据库上下文。
现在我有以下要求:-
在某些操作方法中,我希望我的应用程序向第三方应用程序发送一些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 类,作为存储库应该处理的 仅限数据库和模型类
这不仅仅是关于数据库。 我的感觉是存储库处理"数据源",外部服务属于这种情况。 对此没有绝对的规则。 在你的情况下,什么有意义?
所以我不确定管理共享Web客户端的最佳位置是什么 调用?
我认为存储库很好。 根据您的架构,它还适合在哪里? 您始终可以添加 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)
}
在基本控制器中:
public void SetAdditionalInfo(string description)
{
this.APICallDescription = description;
}
基ActionFilterAttribute
类具有以下可以重写的方法:
OnActionExecuting
– 在控制器操作之前调用此方法 被执行。
OnActionExecuted
– 在控制器操作后调用此方法 被执行。
OnResultExecuting
– 在控制器操作之前调用此方法 结果被执行。
OnResultExecuted
– 在控制器操作后调用此方法 结果被执行。