【问题标题】:common code for all methods in a controller class控制器类中所有方法的通用代码
【发布时间】:2019-01-23 09:24:29
【问题描述】:

我有 10 个控制器使用相同的代码块,但我不知道如何编写一次代码并在任何地方使用它。

我必须定义一个名为:

需要结构支持参数

,然后在对象中设置3个字段。

这是使用它的控制器方法之一:

public class StructureController : Controller
{   
    public IActionResult Index()
    {

        var requiredStructuralSupportParameters = new Structure.RequiredInfo()
        {
            Steel = "1500y",
            Concrete = "5500l",
            Rebar = "95000y"
        };

        var response = callToAPI(requiredStructuralSupportParameters);

        return response.Results;
    }
}

我已尝试将该代码取出并将其放在控制器类的顶部并将其公开,但随后我的控制器看不到它,并且出现 nullreferenceexception 错误。

所以只有当我把它直接放在控制器方法中时它才有效。

有没有办法让所有控制器都可以重复使用相同的代码块?

【问题讨论】:

  • 创建工厂方法或创建 callToAPI 的重载,您不必在此实例中传递。

标签: asp.net-core asp.net-core-mvc asp.net-core-2.0


【解决方案1】:
public class StructureController : Controller
{   
    protected YourType _requiredStructuralSupportParameters;

    public StructureController()
    {
        this._requiredStructuralSupportParameters = new Structure.RequiredInfo()
        {
            Steel = "1500y",
            Concrete = "5500l",
            Rebar = "95000y"
        };
    }
}

然后让您的其他控制器继承您的StructureController

public SomeController : StructureController{

   public IActionResult Index() {
      var response = callToAPI(this._requiredStructuralSupportParameters);

      return response.Results;
   }
}

还没有测试,但我希望你有一个想法

【讨论】:

  • 虽然这个答案在技术上很好,但我会警告不要将基本控制器用于这样的事情。 C# 不支持多重继承,因此您需要非常谨慎地选择什么作为单一继承源。像这里做的事情最好通过配置或常量类来完成。
  • @ChrisPratt 我当然同意。此外,还有一个架构问题:这段代码是否完全属于控制器世界(在我看来,它不属于)所有胖控制器与瘦控制器的故事。它应该更适合一些注入自定义选项的服务。但是,我想这超出了这个问题的范围。
猜你喜欢
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多