跨多个ASP.NET MVC控制器的通用功能

时间:2016-11-03 22:30:05

标签: asp.net-mvc actionmethod

我正在使用ASP.NET MVC应用程序&有一个快速的设计问题给你。 所以我需要为我的所有控制器(嗯,大多数)实现一个通用功能。 我不想在所有控制器中重复相同的逻辑。 什么是最符合MVC最佳利益的理想方法?

我发现有人说创建基本控制器并在控制器中继承它。但是当我想象一个控制器时,我可以看到它只包含返回一些内容/视图的动作方法 - 如果我错了,请纠正我。

   OneController
   {
       ActionMethod A1
       {
           //Code to return list of objects for the given integer value. So it calls database stored procedure.
       }
   }

......有多个这样的控制器。

我仍然希望在OneController中存在A1,只是把它的逻辑放在某个常见的地方。

也有人建议创建普通的Helper类来放置常用方法。

你能否告诉我什么方法会更好(或任何其他适当的方法)?感谢。

1 个答案:

答案 0 :(得分:1)

我同意你的观点,在大多数情况下,当我们谈论Actions或真正相关的方法时,从基础控制器继承是有意义的。但是,当然,你可以只使用基本控制器。你的选择。

除此之外,您还有2个选项。对于几乎没有多态性的类(根据实现而改变行为),您可以创建静态类并在控制器中使用它们。一个例子是进行数学计算的类,这些类本质上不是多态的。

对于所有其他情况,我强烈建议您使用依赖注入。其中一个原因是单元测试将变得更容易。这里有一个关于如何使用内置引擎为MVC 4开始的指南:https://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection。如果您不想使用它并使用Ninject或Simple Injector,您可以实现自己的ControllerActivator并使用Ninject来获取控制器的实例。

使用依赖注入器时,通常你的控制器会在构造函数中获取依赖项,如下所示:

public class StoreController : Controller
{
    private IStoreService service;

    public StoreController(IStoreService service)
    {
        // service in an injected dependency
        this.service = service;
    }
 }

有关更多信息,请参阅Google ASP.NET依赖注入。