Asp.net mvc 在控制器中重用代码

Asp.net mvc 在控制器中重用代码,asp.net-mvc,Asp.net Mvc,我有一个代码块,几乎在每个控制器中都会用到,所以我想知道在多个控制器中重用代码的最佳实践是什么 简单的例子就是这样 public String CoolCode(){ // Stuff return MyStuff; } 然后在另一个控制器中,我只使用 string something = CoolCode(); 我应该把它放在哪里,以及如何在每个控制器中使用它?您应该做的是扩展所有控制器现在继承的控制器类,并使用此抽象来包装所有使用该代码的控制器: public class

我有一个代码块,几乎在每个控制器中都会用到,所以我想知道在多个控制器中重用代码的最佳实践是什么

简单的例子就是这样

public String CoolCode(){
    // Stuff
    return MyStuff;
}
然后在另一个控制器中,我只使用

string something = CoolCode();

我应该把它放在哪里,以及如何在每个控制器中使用它?

您应该做的是扩展所有控制器现在继承的控制器类,并使用此抽象来包装所有使用该代码的控制器:

public class MyControllerBase : Controller
{
   public string CoolCode() { ... } 
}
现在您只需继承您的抽象,而不是默认的抽象:

public class AnyController : MyControllerBase
{
...
}

但是,根据您的需要,不同的方法可能更合适。

您应该扩展所有控制器现在继承的控制器类,并使用此抽象来包装所有使用该代码的控制器:

public class MyControllerBase : Controller
{
   public string CoolCode() { ... } 
}
现在您只需继承您的抽象,而不是默认的抽象:

public class AnyController : MyControllerBase
{
...
}

然而,根据您的需要,不同的方法可能更合适。

MVC控制器与普通类相同,并且控制器具有相同的扩展名.cs

所以use可以使用如下静态方法

HomeController objHomeController = new HomeController();
string something=  objHomeController.CoolCode();

MVC控制器与普通类相同,控制器具有相同的扩展名.cs

所以use可以使用如下静态方法

HomeController objHomeController = new HomeController();
string something=  objHomeController.CoolCode();

我个人会将helper类注入控制器:

public interface IHelper
{
    string CoolCode();
}

public class Helper : IHelper
{
    public string CoolCode()
    {
        return "Cool code";
    }
}

public class SomeController
{
   private IHelper _helper;
   public SomeController(IHelper helper)
   {
       _helper = helper;
   }

   public ActionResult Index()
   {
       //call _helper.CoolCode();
   }
}
然后,我建议您需要使用某种IoC容器来注入它

这一切都很抽象,但我建议你仔细阅读:


我个人会将helper类注入控制器:

public interface IHelper
{
    string CoolCode();
}

public class Helper : IHelper
{
    public string CoolCode()
    {
        return "Cool code";
    }
}

public class SomeController
{
   private IHelper _helper;
   public SomeController(IHelper helper)
   {
       _helper = helper;
   }

   public ActionResult Index()
   {
       //call _helper.CoolCode();
   }
}
然后,我建议您需要使用某种IoC容器来注入它

这一切都很抽象,但我建议你仔细阅读:


适用于任何其他类的内容也适用于控制器-使用继承、组合、创建帮助器类、扩展类等。除非您指定要执行的操作,否则无法给出具体的答案。例如,助手类不能访问控制器的受保护字段,而基类可以。另一方面,基类引入了非常紧密的coupling@PanagiotisKanavos对我来说,这似乎是一个好答案,你应该这样发布。适用于任何其他类的内容也适用于控制器-使用继承、组合、创建帮助器类、扩展类、,除非你具体说明你想做什么,否则不可能给出一个具体的答案。例如,助手类不能访问控制器的受保护字段,而基类可以。另一方面,基类引入了非常紧密的coupling@PanagiotisKanavos对我来说,这似乎是一个很好的答案,你应该这样发布。在这种情况下,我肯定会倾向于组合而不是继承。嗯,我同意你的看法,尽管在我看来,这在很大程度上取决于该方法的逻辑类型。如果它的代码/功能是针对控制器行为的,我会将其保留在抽象中,但如果它只是在控制器中使用,而不是“连贯地”(我刚刚创建了一个新词)正确,那么合成将更有意义。不知道我是否解释了我的意思。。。顺便说一句,因为我通常非常懒惰,不想在每个控制器中初始化新类,所以我会将组合放在基类中:)在这种情况下,我肯定会倾向于组合而不是继承。嗯,我同意你的看法,尽管在我看来,这在很大程度上取决于该方法的逻辑类型。如果它的代码/功能是针对控制器行为的,我会将其保留在抽象中,但如果它只是在控制器中使用,而不是“连贯地”(我刚刚创建了一个新词)正确,那么合成将更有意义。不知道我是否解释了我的意思。。。顺便说一句,因为我通常非常懒惰,不想在每个控制器中初始化新类,所以我会将组合放在基类中:)即使这可以工作,我完全不同意这个答案。这会导致两个控制器之间的强耦合。在我看来,所有“共享”代码都必须放在实用程序/管理器/whatevernameyoulike类或基类中,如果共享代码适用于两个消费代码的基本祖先,我完全同意你的看法Steve,我的答案只是为了满足个人的要求。即使这可以工作,我完全不同意这个答案。这会导致两个控制器之间的强耦合。在我看来,所有“共享”代码都必须放在实用程序/管理器/whatevernameyoulike类或基类中,如果共享代码适用于两个消费代码的基本祖先,我完全同意你的观点Steve,我的答案只是为了满足个人的要求。