构造函数返回的ASP.Net Core返回结果

时间:2018-11-08 14:00:58

标签: c# asp.net-core dependency-injection

在我的应用程序中,控制器构造函数用于创建控制器的其他方法正在使用的初始属性对象。我想确保如果由于某种原因构造函数无法创建必要的对象并引发异常,则IActionResult仍将返回。

但是,由于构造函数没有返回类型,因此不允许我使用类似的内容:

return Ok(new myAspResponse<myObject>(myObjectInstance));

有没有办法通过依赖注入来实现类似的目的?

2 个答案:

答案 0 :(得分:4)

否,构造函数无法返回任何内容。但是他们也不需要。

您最好的选择是制作一个Exception Filter来捕获任何未处理的异常,并以一种易于理解的方式将其返回给客户端。

旁注:如果要从构造函数中的外部源获取数据,则不能使其异步运行,因为是在构造函数中。如果这是您在控制器构造函数中所做的事情,它将阻塞等待数据的线程。因此,您可以考虑是否可以将其移至异步方法(甚至可以将其缓存)。

这不适用于控制器,因为您无法控制其创建方式,但是当我需要获取数据才能创建对象时,我通常的做法是:

  1. 使静态工厂方法像public async Task<MyClass> MyClass.Create()
  2. 声明构造函数private,以便不能在我的Create()方法之外使用它。

如果您发现自己必须在其他课程中这样做,这可能会派上用场。

更新:在您的特定情况下,“通过提供的令牌创建用户对象”,对于AuthenticationHandler来说听起来更好。它就是为此目的而设计的。您可以在此处查看一个示例(此示例将.NET Core 1.0与2.0进行了比较,但如果您正在使用2.0,则可以仅查看2.0部分):https://geeklearning.io/how-to-migrate-your-authentication-middleware-to-asp-net-core-2-0/

答案 1 :(得分:1)

构造函数具有类本身的隐式返回类型;您不能从中“退回”某些东西。如果它引发异常,则将被ASP.NET Core中的异常处理中间件捕获,您可以在其中设置要返回的自定义错误页面。参见:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-2.1