使用ViewModel模式在MVC中放置逻辑的位置



我在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发送到视图,然后在发布时从视图接收数据,并将其发送到服务层进行验证、处理、保存回存储库、其他业务逻辑等。

相关内容

  • 没有找到相关文章

最新更新