Model view controller 重构MVC控制器代码。控制器或模型

Model view controller 重构MVC控制器代码。控制器或模型,model-view-controller,Model View Controller,我在一个控制器中有很多代码,我不知道该放在哪里。首先,我对其进行了重新分解,使其干燥但仍在控制器中 当重新分解代码时,如何时将某些内容移动到模型以及何时将某些内容保留在控制器中,应遵循什么好的指导原则?控制器应主要包含协调代码。所以,如果您有代码执行某些业务或域功能,您可以将其移动。我倾向于使用应用程序服务或简单任务。类似IImageService或IDocumentService(尽管实现可能会变得非常臃肿)。我也喜欢使用单独的任务,比如ILoginTask 然后注入实现(我使用Castle

我在一个控制器中有很多代码,我不知道该放在哪里。首先,我对其进行了重新分解,使其干燥但仍在控制器中


当重新分解代码时,如何时将某些内容移动到模型以及何时将某些内容保留在控制器中,应遵循什么好的指导原则?

控制器应主要包含协调代码。所以,如果您有代码执行某些业务或域功能,您可以将其移动。我倾向于使用应用程序服务或简单任务。类似IImageService或IDocumentService(尽管实现可能会变得非常臃肿)。我也喜欢使用单独的任务,比如ILoginTask

然后注入实现(我使用Castle Windsor和自定义控制器工厂)


仅我的2c---HTH

控制器应主要包含协调代码。所以,如果您有代码执行某些业务或域功能,您可以将其移动。我倾向于使用应用程序服务或简单任务。类似IImageService或IDocumentService(尽管实现可能会变得非常臃肿)。我也喜欢使用单独的任务,比如ILoginTask

然后注入实现(我使用Castle Windsor和自定义控制器工厂)


仅我的2c---HTH

您的模型通常不应包含任何业务逻辑。如果是,则将该模型提取到一个
ViewModel
中,其中唯一的逻辑应该是与显示相关的代码。任何业务方法都应该存在于单独的类中。有些人喜欢一直使用
ViewModels
而不是一般的整体模型(例如
CustomerEditViewModel
而不仅仅是
客户模型

控制器应该非常轻量级,并且不应该有数据访问代码。我通常调用一个repository方法()来轻松加载数据,并将其作为执行的任何业务方法的网关

例如,不需要数据加载代码、一些计算和一些保存代码,而是可以将这些代码放入一个facade类中,该类接受一个模型或
customerId
,并执行如下操作:

CustomerRepository repository = new CustomerRepository(); Customer customer = repository.GetCustomer(customerId); // call some business methods, assign data, etc. .. .. // now save repository.SaveCustomer(customer); CustomerRepository repository=新CustomerRepository(); Customer=repository.GetCustomer(customerId); //调用一些业务方法、分配数据等。 .. .. //现在保存 repository.SaveCustomer(客户);
您的存储库类通常被编码到一个接口;这使得删除/模拟这些类以加载“伪”数据变得非常容易,并且还使控制器和外观与直接链接到类的具体实现,而不是链接到接口分离。

您的模型通常不应包含业务逻辑。如果是,则将该模型提取到一个
ViewModel
中,其中唯一的逻辑应该是与显示相关的代码。任何业务方法都应该存在于单独的类中。有些人喜欢一直使用
ViewModels
而不是一般的整体模型(例如
CustomerEditViewModel
而不仅仅是
客户模型

控制器应该非常轻量级,并且不应该有数据访问代码。我通常调用一个repository方法()来轻松加载数据,并将其作为执行的任何业务方法的网关

例如,不需要数据加载代码、一些计算和一些保存代码,而是可以将这些代码放入一个facade类中,该类接受一个模型或
customerId
,并执行如下操作:

CustomerRepository repository = new CustomerRepository(); Customer customer = repository.GetCustomer(customerId); // call some business methods, assign data, etc. .. .. // now save repository.SaveCustomer(customer); CustomerRepository repository=新CustomerRepository(); Customer=repository.GetCustomer(customerId); //调用一些业务方法、分配数据等。 .. .. //现在保存 repository.SaveCustomer(客户); 您的存储库类通常被编码到一个接口;这使得清除/模拟这些类以加载“伪”数据变得非常容易,并且还使控制器和外观与直接链接到类的具体实现,而不是链接到接口分离