何处使用ViewModel Pattern将Logic放置在MVC中

时间:2013-02-05 09:39:42

标签: asp.net asp.net-mvc asp.net-mvc-3 viewmodel

我在asp.net mvc 3中使用ViewModel。

在我的情况下,我有一个控制器,用于启动连接到View的ViewModel。

如果URL中没有附加变量DateForLookUp,则控制器使用DateTime.UctNow初始化ViewModel,否则使用该变量。

我需要在视图上创建链接。当用户点击该链接时,我必须使用DateForLookUp值并添加或减去一天。

我的问题:

  • 在哪里放置此逻辑,ServiceLayer,ViewModel,Controller或View?

查看

@Html.ActionLink("Next Day", "Daily")

@Html.ActionLink("Previous Day", "Daily")

CONTROLLER

    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);
    }

1 个答案:

答案 0 :(得分:2)

在我看来(在实践中),我会在服务层中放置任何和所有逻辑。

我将我的MVC应用程序分成几个不同的项目,以保持所有层分离:

  • AppName.Configuration:处理应用程序的任何配置(即拉入web.config / app设置,资源文件等)
  • AppName.Data:这是执行所有数据库访问的数据层(没有业务逻辑)。 DBML / EDMX就在这里,我的存储库类也在这里。
  • AppName.Models:这是为MVC定义的所有ViewModel,以及整个应用程序所需的其他模型对象。
  • 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:其他实用程序的公共库

我的控制器除了从服务层获取ViewModel以发送到视图然后从视图发送后接收数据并将其发送到服务层以进行验证,处理,保存回存储库,其他操作时什么都不做商业逻辑等。