Asp.net mvc 在MVC的ViewModel中包含业务逻辑有意义吗?
目前,我正在使用Asp.NETMVC:存储库、工作单元模式、服务层和视图模型 在这个项目中,每个视图都链接到一个ViewModel类,控制器是精简的,因此业务层位于服务层上 我在控制器中创建ViewModel类的实例,并将其传递给视图,如下所示Asp.net mvc 在MVC的ViewModel中包含业务逻辑有意义吗?,asp.net-mvc,asp.net-mvc-3,design-patterns,viewmodel,Asp.net Mvc,Asp.net Mvc 3,Design Patterns,Viewmodel,目前,我正在使用Asp.NETMVC:存储库、工作单元模式、服务层和视图模型 在这个项目中,每个视图都链接到一个ViewModel类,控制器是精简的,因此业务层位于服务层上 我在控制器中创建ViewModel类的实例,并将其传递给视图,如下所示 public ActionResult Create() { EventCreateViewModel eventViewModel = new EventCreateViewModel(); return
public ActionResult Create()
{
EventCreateViewModel eventViewModel = new EventCreateViewModel();
return View(eventViewModel);
}
在某些ViewModel中,我用来调用服务层
系统工作正常,但我想知道在ViewModel中添加对服务层的调用是否是一个好主意,或者更好的做法是将此操作仅留给控制器
可以说,控制器是应该控制的组件。ViewModel应该只是一个数据容器,仅此而已
记住单一责任原则。一旦开始分配逻辑,记住和理解所有运动部件将变得越来越困难 可以说,控制器是应该控制的组件。ViewModel应该只是一个数据容器,仅此而已
记住单一责任原则。一旦开始分配逻辑,记住和理解所有运动部件将变得越来越困难 嗨,丹尼斯,根据你的回答;如果我想挂接另一个客户端/表示界面,可能是一个移动客户端,这是否意味着控制器中的一些逻辑需要为另一个客户端复制?在这种情况下,创建可重用组件的最佳方法是什么?@Donny Reusability在我看来被高估了。通过尽可能多地重用,您限制了独立开发不同客户机/用户界面的能力。就像所有事情一样,这是一个需要权衡的问题。但是现在我更倾向于一些重复,而不是跨不同平台的公共架构或代码库将强制执行的约束;如果我想挂接另一个客户端/表示界面,可能是一个移动客户端,这是否意味着控制器中的一些逻辑需要为另一个客户端复制?在这种情况下,创建可重用组件的最佳方法是什么?@Donny Reusability在我看来被高估了。通过尽可能多地重用,您限制了独立开发不同客户机/用户界面的能力。就像所有事情一样,这是一个需要权衡的问题。但是现在我更倾向于一些重复,而不是跨不同平台的公共体系结构或代码库将强制执行的约束。
public class EventCreateViewModel
{
public CandidateListViewModel CandidateList = new CandidateListViewModel();
public EventCreateViewModel()
{
DateTimeStart = DateTime.UtcNow; // Add a default value when a Date is not selected
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using XXX.Models;
using XXX.Service;
namespace XXX.ViewModels
{
public class CandidateListViewModel
{
// We are using the Service Layer
private ICandidateBL serviceCandidate;
// Property
public IDictionary<string, string> Candidates = new Dictionary<string, string>();
// An utility method that convert a list of Canddates from Enumerable to SortedDictionary
// and save the result to an inner SortedDictionary for store
public void ConvertSave(IEnumerable<Candidate> candidates)
{
Candidates.Add("None", "0"); // Add option for no candidate
foreach (var candidate in candidates)
Candidates.Add(candidate.Nominative, candidate.CandidateId.ToString());
}
#region Costructors
public CandidateListViewModel()
{
serviceCandidate = new CandidateBL();
ConvertSave(serviceCandidate.GetCandidates());
}
// Dependency Injection enabled constructors
public CandidateListViewModel(ICandidateBL serviceCandidate)
{
this.serviceCandidate = serviceCandidate;
}
public CandidateListViewModel(IEnumerable<Candidate> candidates)
{
serviceCandidate = new CandidateBL();
ConvertSave(candidates);
}
#endregion
}
}