模型和控制器之间的关注点分离
本文关键字:关注点 分离 之间 控制器 模型 | 更新日期: 2023-09-27 18:14:28
我仍然在试图理解整个关注点的分离,我不理解的一件事是模型和控制器在数据修改方面的区别。
假设我有一个简单的模型:
public class BankAccount
{
private decimal amount;
public decimal Amount
{
get
{
return amount;
}
private set
{
amount = value;
}
}
public BankAccount(decimal amount)
{
Amount = amount;
}
public decimal DepositMoney(decimal amount)
{
Amount += amount;
return amount;
}
public decimal WithdrawMoney(decimal amount)
{
Amount -= amount;
return amount;
}
}
我相信这就是模型的意义所在。但是,我在哪里调用这些方法?它在控制器内部吗?我可以修改那里的数据吗?例如,如果我想把一些钱从Jim转到Joe;我要从控制器调用这个方法joe.DepositMoney(jim.WithdrawMoney(25));
吗?或者我应该创建一个在模型中转移资金的方法并调用这个方法?
模型应该具有与其自身功能相关的功能。您可以有一个接收另一个帐户的功能转移。
控制器是处理用户交互的组件,与模型一起工作,并最终选择一个视图来呈现UI
你应该在控制器中使用这些方法。无论如何,我建议你保持你的项目坚固,如果你的项目增长(他们增长得很快),你将有很多逻辑在你的控制器中完成,将很难解决错误。
你可以有服务来保持逻辑在控制器之外,控制器使用这些服务。无论如何,这是一个非常简单的方法。我建议你读这样的书:http://blogs.msdn.com/b/cesardelatorre/archive/2010/03/26/our-brand-new-ddd-n-layer-net-4-0-architecture-guide-book-and-sample-app-in-codeplex.aspx
你会得到很多概念和想法,可以帮助你的未来。
那么最重要的是要有很多工具,并使用确切的谁适合你的问题。
这个链接应该可以帮助你更好地理解:
http://tomdalling.com/blog/software-design/model-view-controller-explained/总之,模型处理与数据相关的操作,控制器处理诸如用户输入、计算(在你的例子中)、条件等操作,视图向用户呈现格式化的输出。
我希望这对你有帮助。
基本上控制器所做的就是将表示层(视图)粘合到后端层(数据模型)。
在关注点分离中,视图不应该知道模型,模型也不应该知道视图。它们之间唯一的连接是中间层,也就是控制器,所以如果你想要转账或更新钱,它必须从视图出发,触发控制器中的一个动作,后者触发模式中的一个数据库操作。
谢谢
. NET MVC是一个使用模型-视图-控制器(MVC)模式的框架。
"关注点分离"本质上意味着-
- 数据(业务逻辑)[模型]
- 可视化表示(HTML等)[View]
- 控制用户动作[Controller]
你可以把控制器看作是与模型和视图通信的中间层。
示例中的方法将在控制器中调用。
例如:public ActionResult Example()
{
BankAccount Model = new BankAcount(20);
Model.Variable = Modify.Me;
...
return View(Model);
}
因此,当Action
示例被调用时,将创建BankAccount
模型的一个新实例,并返回一个视图(即强类型的BankAccount)。
是的,您将从控制器内部调用该方法joe.DepositMoney(...);
。请记住,HTTP是一个无状态协议,因此这些数据将被丢弃。
许多应用程序使用服务来处理数据操作(例如访问数据库)。
似乎有很多关于模型和视图模型的混淆。MVC的要点是
- 你有一个控制器(类),它有动作(方法)。动作响应用户输入(HTTP请求)。
- 控制器生成一些包含需要呈现的数据的对象——这个对象被称为视图模型。视图模型定义了必须呈现的内容,但没有定义如何呈现。
- 视图模型被传递给视图。视图负责"包装"视图模型,并生成一些东西来适当地呈现它——通常它生成HTML标记。
这就是ASP。NET MVC的全部内容。你有一个控制器,你创建一个视图模型,你把它传递给视图然后视图生成一些表示
然而,模型是一个非常令人困惑的术语。它通常用于描述视图模型数据的源。最好的做法是让所有的逻辑都在控制器之外处理;为此,您应该有一个服务层。服务基本上应该为视图模型生成适当的数据,并在必要时执行适当的逻辑。所以,总的来说,它应该是这样的:
- 控制器对用户输入作出反应,确定究竟发生了什么,并将所有相关数据传递给适当的服务。
- Service包含所有的逻辑和生成的数据,可以用来响应用户的输入。
- 控制器使用这些服务生成的数据来创建一个视图模型。
- 视图模型被传递给视图并适当渲染。