2011-04-15 90 views
1

我在控制器中有很多代码,我不知道该把它放在哪里。首先我重新考虑它,以便它干燥,但仍然在控制器中。重构MVC控制器代码。控制器或型号

对代码进行重新分解时,如何将某些东西移动到模型以及何时将某些东西保存在控制器中,遵循什么是一个很好的指导原则?

回答

2

您的模型一般不应包含任何业务逻辑。如果确实如此,请将该模型提取到ViewModel,其中唯一的逻辑应该是您的显示相关代码。任何业务方法都应该存在于一个单独的类中。有些人倾向于始终使用ViewModels而不是一般的整体模型(例如,CustomerEditViewModel而不仅仅是Customer model)。

控制器应该非常轻便,不应该有数据访问代码。我通常会调用存储库方法(​​)轻松加载数据,并将Facade Pattern作为所有业务方法的网关。

例如,而不是数据加载代码,一些计算,有的保存代码,这可能全部被放入一个门面类,它的模型或customerId和做一些事情,如:

 
CustomerRepository repository = new CustomerRepository(); 
Customer customer = repository.GetCustomer(customerId); 
// call some business methods, assign data, etc. 
.. 
.. 
// now save 
repository.SaveCustomer(customer); 

你存储库类通常编码到接口;这使得对这些类进行存根/模拟非常容易加载“假”数据,并且还可以将控制器和外观从直接链接到类的具体实现,而不是链接到接口。

2

控制器应主要包含协调代码。因此,如果您有代码执行某项业务或域名功能,您可以移动。我倾向于使用应用程序服务或简单的任务。就像IImageService或IDocumentService(虽然实现可能会变得相当臃肿)。我也喜欢使用诸如ILoginTask之类的单个任务。

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

Just my 2c --- HTH