MVC模型对象,域对象和DTO之间有什么区别?
我的理解是:
MVC模型对象:
为相应视图显示的数据建模.它可能不直接映射到域对象,即可能包括来自一个或多个域对象的数据.
域对象:
用于对问题域中的现实世界对象进行建模的对象,如预留,客户,订单等.用于保存数据.
DTO(数据传输对象):
当层处于单独的进程中时,用于在层之间传输数据的对象,例如从DB到客户端应用程序.在获取与多个域对象相对应的数据时,允许跨线的单个事务而不是多个调用.DTO仅包含数据和访问器方法,并且不存在逻辑.该数据用于特定的DB事务,因此它可以或可以不直接映射到域对象,因为它可以包括来自一个或多个域对象的数据.
所以,问题:
以上理解是否正确?我错过了一些关键点吗?
是否有任何理由不使用Domain对象作为MVC模型,假设Model对象不需要额外的业务逻辑?
是否有任何理由不使用DTO作为MVC模型,假设Model对象不需要额外的业务逻辑?
我是一个有角度的新蜜蜂.我正在尝试编写一个验证,在用户尝试关闭浏览器窗口时提醒用户.
我的页面v1和v2上有2个链接.当点击指向特定页面的链接时.这是重定向到v1和v2的代码
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/v1', {templateUrl: 'pages/v_1.html', controller: MyCtrl1});
$routeProvider.when('/v2', {templateUrl: 'pages/v_2.html', controller: MyCtrl2});
$routeProvider.otherwise({redirectTo: '/v1'});
}]);
Run Code Online (Sandbox Code Playgroud)
当用户点击v1"他即将离开v1,如果他想继续"并且点击v2时,我想弹出一条消息.任何关于如何实现这一点的指示将不胜感激.
更新的代码;
控制器
function MyCtrl1() {
$scope.$on('$locationChangeStart', function (event, next, current) {
if ('your condition') {
event.preventDefault();
MessageService.showConfirmation(
'Are you sure?',
MessageService.MessageOptions.YES_NO, {
'YES': function () {
blockNavigation = false;
$location.url($location.url(next).hash());
$rootScope.$apply();
},
'NO': function () {
MessageService.clear();
$log.log('NO Selected')
}
});
}
});
}
MyCtrl1.$inject = [];
function MyCtrl2() {}
MyCtrl2.$inject = …Run Code Online (Sandbox Code Playgroud) javascript model-view-controller angularjs angularjs-directive
有人可以用尽可能简单的方式解释Model View Presenter模式是什么吗?与模型视图控制器有什么区别?哪个最好或用于哪个目的?
由于其双向数据绑定功能,Angular one或多或少遵循MVV*设计原则.
Angular2正在采用基于组件的UI,这是React开发人员可能熟悉的概念.从某种意义上说,Angular 1.x控制器和指令模糊了新的Angular 2 Component.
这意味着在Angular 2中没有控制器也没有指令.相反,组件有一个选择器,它对应于组件将表示的html标签,而@View则指定要填充的组件的HTML模板.
Angular2仍然实现双向数据绑定,但不包含模型,例如,如果我有一个@Component显示文章列表和一个class定义文章对象的模型:
class Article {
title: string;
link: string;
votes: number;
constructor(title: string, link: string, votes?: number){
this.title = title;
this.link = link;
this.votes = votes || 0;
}
Run Code Online (Sandbox Code Playgroud)
这在MVC模式中将被视为模型.
那么考虑到这个Angular最接近的设计模式呢?
我正在阅读JSF,我觉得为什么JSF是一个MVC框架(或者至少哪个部分属于哪个"字母")我感到很困惑.
我看了一下这个问题:JSF MVC框架中哪些组件是MVC?
我在那里阅读如果你不在聚合视图中查看模型是你的实体,视图是你的XHTML代码而控制器是托管bean.嗯......好的,但视图通常不依赖于执行进一步的业务逻辑调用,这些调用返回一组实体,例如,描述是否仍然适合?
我读过的一本书将其描述为托管bean,是Faces Servlet(Controller)用于调用业务层(Model)的某种"消息"bringer,然后XHTML代码就是视图.
有太多的解释和差异,所以我不知道哪个或如何理解它.
ASP.NET MVC路由在映射时具有名称:
routes.MapRoute(
"Debug", // Route name -- how can I use this later????
"debug/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = string.Empty } );
Run Code Online (Sandbox Code Playgroud)
有没有办法获取路由名称,例如上面的例子中的"Debug"?我想在控制器的OnActionExecuting中访问它,以便我可以在调试时在ViewData中设置内容,例如,通过在/ debug /前面添加一个URL ...
我对MVC中"模型"的概念感到非常困惑.今天存在的大多数框架将模型放在Controller和数据库之间,而模型几乎就像数据库抽象层.随着Controller开始做越来越多的逻辑,'Fat Model Skinny Controller'的概念就丢失了.
在DDD中,还有域实体的概念,它具有唯一的身份.据我了解,用户是实体的一个很好的例子(例如,唯一的用户ID).实体有一个生命周期 - 它的值可以在整个动作过程中改变 - 然后它被保存或丢弃.
我上面描述的实体是我认为模型应该在MVC中的内容?我有多偏离基础?
为了使事情更加混乱,你会引入其他模式,例如Repository模式(可能会在其中放置一个Service).很清楚Repository如何与实体交互 - 它与模型有什么关系?
控制器可以有多个模型,这使得模型看起来像一个"数据库表"而不是一个独特的实体.
更新: 在这篇文章中,模型被描述为具有知识的东西,它可以是单数或对象的集合.所以听起来更像是一个实体,一个模型或多或少都是一样的.模型是一个包罗万象的术语,其中实体更具体.值对象也是一个模型.至少在MVC方面.也许???
所以,从非常粗略的角度来看,哪个更好?
没有"模特"真的......
class MyController {
public function index() {
$repo = new PostRepository();
$posts = $repo->findAllByDateRange('within 30 days');
foreach($posts as $post) {
echo $post->Author;
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者这个,它有一个模型作为DAO?
class MyController {
public function index() {
$model = new PostModel();
// maybe this returns a PostRepository?
$posts = $model->findAllByDateRange('within 30 days');
while($posts->getNext()) {
echo $posts->Post->Author;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两个例子都没有做我上面描述的内容.我很丢失.有什么输入?
我在这里已经多次看到过这个问题,但是没有一个问题可以接受:
ASP.NET MVC @ Url.Action包括当前路由数据
ASP.NET MVC隐式添加路由值
基本上我有一个名为Group的动作方法的Controller,它有一个不接收参数的重载并显示一个元素列表,另一个接收一个id并显示该组的详细信息.
如果我做这样的事情:
Url.Action("Group", "Groups");
Run Code Online (Sandbox Code Playgroud)
从网站的主页面(/)它返回一个这样的网址:
"mysite.com/Groups/Group"
Run Code Online (Sandbox Code Playgroud)
没关系现在,如果站点的当前地址是/ Groups/Group/1并且我调用相同的方法
Url.Action("Group", "Groups");
Run Code Online (Sandbox Code Playgroud)
返回的网址是这样的:
"mysite.com/Groups/Group/1"
Run Code Online (Sandbox Code Playgroud)
它会在生成URL时自动为当前页面添加路由值.即使我这样生成URL:
Url.Action("Group", "Groups", null);
Run Code Online (Sandbox Code Playgroud)
因此,明确指定我不想要任何路由值,生成的URL是相同的.要获取我想要的地址,我必须将路由值显式设置为空字符串,如下所示:
Url.Action("Group", "Groups", new {id=""});
Run Code Online (Sandbox Code Playgroud)
这将生成以下URL:
"mysite.com/Groups/Group"
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么会发生这种情况?如果我没有设置任何路由值,则不应将它们添加到生成的URL中.
我正在使用JSP和JDBC实现MVC.我已将数据库类文件导入到我的JSP文件中,并且我想显示数据库表的数据.我不知道应该如何ResultSet从Java类返回到JSP页面并将其嵌入HTML中.
我怎样才能做到这一点?
我正在尝试使用声明身份asp.net创建用户我在创建声明身份用户时遇到此错误.
ApplicationUser user = new ApplicationUser {
EmailConfirmed = true,
UserName = model.myUser.Email,
Email = model.myUser.Email ,
PhoneNumber = model.myUser.PhoneNumber,
PhoneNumberConfirmed = true,
UserImagePath = model.myUser.UserImagePath,
FirstName= model.myUser.FirstName,
LastName = model.myUser.LastName,
DateOfBirth = model.myUser.DateOfBirth,
Culture = model.myUser.Culture,
Role = model.myUser.Role
};
Run Code Online (Sandbox Code Playgroud)
但是当代码是
var user= new ApplicationUser {
UserName = model.myUser.Email,
Email = model.myUser.Email ,
};
Run Code Online (Sandbox Code Playgroud)
它工作得很好,所以我想知道出了什么问题