C# MVC4理想控制器编码

C# MVC4理想控制器编码,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我从朋友那里收到了一个mvc4应用程序,我将在其中添加一些函数。但我发现他使用的控制器有6000多行代码。 我想知道开发MVC4应用程序的理想方法是什么 意味着拥有多个控制器,每个控制器中的行代码数量很少。或者使用少量控制器和大量行代码 我认为没有“正确”的答案,尤其是没有任何具体的例子 考虑一下未来的可维护性。具有数千行代码的单片控制器可能比更小、目标更明确的控制器更难理解(因此也更难维护) 另外,我会仔细查看进入控制器的代码类型。控制器用于将您的模型链接到您的视图,而不是业务逻辑代码的最佳位

我从朋友那里收到了一个mvc4应用程序,我将在其中添加一些函数。但我发现他使用的控制器有6000多行代码。 我想知道开发MVC4应用程序的理想方法是什么


意味着拥有多个控制器,每个控制器中的行代码数量很少。或者使用少量控制器和大量行代码

我认为没有“正确”的答案,尤其是没有任何具体的例子

考虑一下未来的可维护性。具有数千行代码的单片控制器可能比更小、目标更明确的控制器更难理解(因此也更难维护)


另外,我会仔细查看进入控制器的代码类型。控制器用于将您的模型链接到您的视图,而不是业务逻辑代码的最佳位置;我个人会将任何重要的业务逻辑放入控制器引用的某种存储库中。

我认为您的朋友可能会将业务逻辑放入控制器中。您应该将业务逻辑放到其他类、文件夹或项目中。

这个问题肯定没有通用的解决方案,但是您可以通过使用存储库来减少控制器中的“行”数,这也将使您能够使用依赖项注入模式

依赖注入也将有助于单元测试。存储库将逻辑划分为一个单独的(可替换的)类

搜索这些术语将提供大量信息(不幸的是,太多了,无法将所有信息放在一个所谓的问题中)——但下面是一些代码,可以帮助您朝着正确的方向前进:

创建一个接口来定义存储库

public interface IGenericControllerRepository
{
    MyModel[] ComplexMethod();
}
控制器类:

public class GenericController : Controller
{
    private IGenericControllerRepository repository;

    public GenericController() : this(new GenericRepository()) { }

    public GenericController(IGenericControllerRepository genericRepository)
    {
        this.repository = genericRepository;
    }

    // GET: /controller
    public ActionResult Index()
    {
        MyModel[] m = repository.ComplexMethod();
        return View("Index", m);
    }
}
存储库类

public class GenericRepository : IGenericControllerRepository
{
    public MyModel[] ComplexMethod()
    {
        // do work here
    }
}

很难判断是否应该将控制器拆分为较小的控制器,因为这实际上取决于方法的数量,而不是行的数量(例如,您可能有几个方法有数百行),在这种情况下,将它们拆分为另一个控制器将无法获得期望的结果。您的控制器应该分为“应用程序逻辑”容器。

6000行代码很难闻。您需要将其分解为逻辑组件,每个区域都是控制器。设想一个CRM系统或类似的系统——你可能有以下控制器、管理员、用户、客户、通信等——将其逻辑分解任何代码,不一定是控制器代码,有6000行代码是可疑的,并且会违反坚实原则的S部分。谷歌“瘦控制器”,这将是一个良好的开端。