重构MVC控制器代码控制器或模型

问题描述

| 我在控制器中有很多代码,但不确定在哪里放置它。首先,我对其进行了重构,使其干燥,但仍在控制器中。 在重构代码时(例如何时将某些内容移动到模型中以及何时将某些内容保留在控制器中)应遵循什么好的指导方针?     

解决方法

您的模型通常不应包含任何业务逻辑。如果是这样,则将该模型提取为
ViewModel
,并且其中唯一的逻辑应该是与显示相关的代码。任何业务方法都应存在于单独的类中。有些人更喜欢一直使用
ViewModels
而不是一般的整体模型(例如
CustomerEditViewModel
而不是仅仅
Customer model
)。 控制器应非常轻巧,并且不应包含数据访问代码。我通常会调用存储库方法(Repository Pattern)来轻松加载数据,而Facade Pattern则是执行任何业务方法的网关。 例如,除了拥有数据加载代码,一些计算和一些保存代码之外,所有这些都可以放入带有模型或4并执行类似操作的Facade类中: CustomerRepository存储库= new CustomerRepository(); 客户客户= repository.GetCustomer(customerId); //调用一些业务方法,分配数据等 .. .. //现在保存 repository.SaveCustomer(customer); 您的存储库类通常被编码为接口。这使得对这些类进行存根/模拟非常容易,以加载“假”数据,并使控制器和Facade不再直接链接到类的具体实现,而是链接到接口。     ,控制器应主要包含协调代码。因此,如果您偶然有执行某些业务或域功能的代码,则可以将其移开。我倾向于使用应用程序服务或简单的任务。类似于IImageService或IDocumentService(尽管实现可能变得肿)。我还喜欢使用单个任务,例如ILoginTask。 然后注入实现(我将Castle Windsor与自定义控制器工厂一起使用)。 只是我的2c --- HTH     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...