我在asp.net mvc 3中使用ViewModel。
在我的情况下,我有一个控制器,它启动连接到视图的ViewModel。
如果URL中未附加变量DateForLookUp
,则控制器将使用DateTime.UctNow初始化ViewModel,否则将使用该变量。
我需要在视图上创建链接。当用户单击链接时,我必须获取DateForLookUp
值,并在一天内进行加法或减法运算。
我的问题:
- 将此逻辑、ServiceLayer、ViewModel、Controller或View放置在何处合适
查看
@Html.ActionLink("Next Day", "Daily")
@Html.ActionLink("Previous Day", "Daily")
控制器
public ActionResult Daily(string dateForLookUp)
{
DateTime dateTimeForLookUp;
if (string.IsNullOrWhiteSpace(dateForLookUp))
dateTimeForLookUp = DateTime.UtcNow;
else
dateTimeForLookUp = DateTime.Parse(dateForLookUp);
var eventsInDate = eventAggregateService.FindAllForDate(dateTimeForLookUp);
EventsAggregateDailyListViewModel eventDailyVM = new EventsAggregateDailyListViewModel();
eventDailyVM = new EventsAggregateDailyListViewModelBuilder().Build(eventDailyVM, dateTimeForLookUp);
return View(eventDailyVM);
}
在我看来(在实践中),我会将任何和所有逻辑都放在服务层中。
我把我的MVC应用程序分成几个不同的项目,以保持所有层都很好地分离:
- AppName.Configuration:处理应用程序的任何配置(即拉入web.config/app设置、资源文件等)
- AppName.Data:这是执行所有DB访问的数据层(无业务逻辑)。DBML/EDMX住在这里,我的存储库类也住在这里
- AppName.Models:这是我的所有ViewModels为MVC以及整个应用程序所需的其他模型对象定义的地方
- AppName.Services:这是我的业务层,所有东西都必须通过这里才能到达数据层或演示文稿/web层。ViewModel是根据数据库对象构建的,数据验证在这里进行,等等
- AppName.Web:这将是MVC应用程序
- AppName.Data.Test:数据应用程序的单元测试
- AppName.Services.Test:服务的单元测试
- AppName.Web.Test:MVC控制器的单元测试
- AppName.Web.UI.Test:Web用户界面的单元测试(使用WATIN)
我还有一组打包成NuGet包的类,如果需要,我可以添加到我的应用程序中,即(对于本例):
- CompanyName.Data:数据层逻辑的公共库
- CompanyName.MVC:ASP.NET MVC集成的公共库
- CompanyName.Utilities:杂项实用程序的公共库
我的控制器什么也不做,只从服务层获取ViewModels发送到视图,然后在发布时从视图接收数据,并将其发送到服务层进行验证、处理、保存回存储库、其他业务逻辑等。