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(客户);
您的存储库类通常被编码到一个接口;这使得清除/模拟这些类以加载“伪”数据变得非常容易,并且还使控制器和外观与直接链接到类的具体实现,而不是链接到接口分离