有没有办法在不使用API的网址的情况下从另一个类调用您的应用程序API控制器?
例如,我在“personContoller”中使用此方法
public async Task<ActionResult> GetPersonRecord(string id)
{
Person person;
var link = "api/entity/Person/" + id + "?format=json";
string results = await OneIMAction(link);
person = JsonConvert.DeserializeObject<Person>(results);
string json = JsonConvert.SerializeObject(person, Formatting.Indented);
return Content(json, "application/json");
}
如何在同一个应用程序中的另一个C#类中访问此方法的JSON结果,而无需使用Web请求?这可能吗?
答案 0 :(得分:2)
根据单一责任原则(S.O.L.I.D.的第一项原则),“每个模块或类别应对软件提供的单一功能部分负责”。
从API Controller继承的类必须响应Web请求。如果我们希望API控制器可以访问另一个API控制器的某些操作,我们应该创建一个Web请求并调用该URL(不推荐)。如果我们希望通过多种方法调用任务,我们会将其转移到Facade,后者称为类服务。并且想要使用它的API控制器的所有操作都将使用类服务。
public class TestService
{
public void Do()
{
// ...
}
}
public class HomeController1 : Controller
{
public ActionResult Index()
{
var service = new TestService();
service.Do();
return View();
}
}
public class HomeController2 : Controller
{
public ActionResult Index()
{
var service = new TestService();
service.Do();
return View();
}
}
答案 1 :(得分:0)
即使可能,控制器和操作也不打算在代码内部调用。它们被设计为甚至具有http响应,因此如果您要调用该函数,则需要查找这些响应并使用try catch来检查200响应。
如果你想重用代码,你需要在另一个函数中使用你正在使用的代码,并保持控制器和动作只是为了调用函数。我通常在我的业务逻辑中有这样的东西。
例如,在您的人员课程或扩展人员课程的课程中,您可以拥有以下内容:
public static Person GetPerson(string id){
}
然后您可以在控制器和api控制器中调用它。
答案 2 :(得分:0)
为什么使用网络请求?如果它是一个相同的应用程序,你可以将一个控制器调用到另一个控件
public class HomeController : Controller
{
public async Task<ActionResult> GetPersonRecord(string id)
{
PersonController person =new PersonController();
var Value =person.PersonDetails()
Value = JsonConvert.DeserializeObject<Person>(results);
string json = JsonConvert.SerializeObject(person, Formatting.Indented);
return Content(json, "application/json");
}
}
public class PersonController : Controller
{
[HTTPPOST]
public void PersonDetails ( int PersonID)
{
return XXXX;
}
}