我有一个包含5个项目的分层核心2.1 Web API解决方案。数据用于使用存储库模式的我的存储库。助手有我的实用程序类。模特是我的模特。服务层包含用于连接存储库的代码。 WebAPI是带有Restful属性路由的控制器的前端。控制器调用服务层,该服务层使用助手和模型调用存储库以获取数据。
这是一个重写,我正在将控制器代码移至具有接口的服务层。大多数方法签名都有一个任务,当我将它们移回时,我不确定如何返回数据,因为在控制器中时,它具有返回Content(result)。
控制器逻辑:
public async Task<IActionResult> ResourceLoginByUserName([FromBody] ResourceLogin obj)
服务层接口:
Task<IActionResult> ResourceLoginByUserName(ResourceLogin obj, HttpRequest Request, string connectionString);
服务层代码:
public Task<string> ResourceLoginByUserName(ResourceLogin obj, HttpRequest Request, string connectionString)
{
//This works as a return type of Task<string> but not IActionResult
返回Task.FromResult();
}
If I put IActionresult on the Service layer signature I get the error: Cannot implicitly convert type System.Threading.Tasks.Task<string> to System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>.
我只需要知道执行此操作的正确模式? TIA
答案 0 :(得分:0)
Task<T>
的泛型类型参数的类型应该只是方法应返回的对象的类型。我不确定这是什么困惑。您尚未真正提供有关正在使用哪种类型的任何信息,但是对于ResourceLoginByUserName
之类的情况,您可能希望返回某种类型的对象,该对象具有成功/失败状态,访问权限令牌和错误列表(如果有)。例如:
public class LoginResult
{
public bool Succeeded { get; set; }
public string AccessToken { get; set; }
public List<string> Errors { get; set; } = new List<string>();
}
在这种情况下,返回值为Task<LoginResult>
。
基本上,您只需要构建一个类即可对方法调用中您认为可能需要的信息进行建模,然后将其返回。在获取内容的情况下,您可以直接返回对象:
public Task<Foo> GetFoo(int id)
或者您可能仍想创建专门的结果类以提供其他信息:
public class GetFooResult
{
public bool Succeeded { get; set; }
public Foo Foo { get; set; }
public List<string> Errors { get; set; }
}
这完全取决于您和应用程序中的需求。我会说最好遵循一种轻松的模式。例如,您总是可以返回某种“结果”类,然后您将知道可以始终检查result.Succeeded
中是否有常规通过/失败条件。