重构MVC控制器代码。控制器或型号

时间:2011-04-15 18:57:18

标签: model-view-controller

我在控制器中有很多代码,我不确定在哪里放置它。首先,我重新考虑它,以便它干,但仍在控制器中。

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

2 个答案:

答案 0 :(得分:3)

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

控制器应该非常轻量级,并且不应该包含数据访问代码。我通常调用存储库方法(Repository Pattern)来轻松加载数据,并Facade Pattern作为执行任何业务方法的网关。

例如,除了拥有数据加载代码,一些计算和一些保存代码之外,这些都可以放入一个外观类中,该类需要一个模型或customerId,并执行以下操作:

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

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

答案 1 :(得分:2)

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

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

只是我的2c --- HTH