这个特定的服务类在我的域中应该是什么样的?

时间:2011-02-07 08:37:18

标签: asp.net-mvc entity-framework-4 asp.net-mvc-3 class-design domain-model

我来自WebForms世界,其中所有逻辑都位于aspx页面的代码隐藏中。在阅读了几本关于ASP.NET MVC的书籍,听了一些播客并在Tekpub上观看了一些视频后,我认为现在是时候采取一些不同的方式。

不幸的是,我已经卡住了。

我正在尝试构建某种小型和基本的CMS,我可以在其中添加多个网站。

我知道我应该保持我的控制器很薄,所以我想我应该使用某种服务类(让我们称之为WebsiteService)来做到这一点。我正在使用Entity Framework进行数据访问,而我的Views都使用特定的ViewModel。当我创建或编辑网站时,这四件事情应该发生:

  • 验证输入
  • 将有关网站的信息添加到数据库(如果是编辑,则更新信息)
  • 在磁盘上创建目录(如果是编辑,则可能重命名该目录)
  • 向IIS网站添加主机标头(可能删除旧主机标头,如果是编辑则可以删除新主标头)

基本上,我认为WebsiteService应该执行更高级的验证,写入数据库,创建/编辑目录,添加/删除主机头并向控制器返回一些内容以指示它是否成功。

这门课应该是什么样的?我有几个问题,我不知道答案。

  1. WebsiteService是否还应将CreateWebsite ViewModel转换为实际的网站类,或者应该做其他事情以使WebsiteService接受实际的网站对象?
  2. 使用ViewModel上的Validation属性完成基本输入验证。还应该进行更广泛的验证(“数据库中是否已存在具有此域名的网站?”)。 WebsiteService也应该这样做吗?
  3. 是否所有3个步骤(保存到数据库,创建目录,向IIS添加主机头)都应该在一个公共方法(WebsiteService.SaveWebsite(ViewModels.CreateWebsite website))中完成,还是应该提供控制器必须调用的单独方法? (我想不是因为我认为通话顺序很重要。)

1 个答案:

答案 0 :(得分:1)

对此的回答是部分主观的,意见问题,但这是我的想法:

  1. 可以。但更好的方法是使用AutoMapper为您执行此操作。用于数据驱动的MVC应用程序的“必备”开源工具之一。

  2. 是 - 输入验证应通过View Models上的验证属性完成。更广泛的/域/业务验证可以在服务中完成,也可以在域模型本身上完成。我更喜欢(并使用)第二种选择。我的域模型也是我的POCO(由EF使用),但我有特定于域(但不是数据库)的额外方法/属性。

  3. 不,我认为这应该是单独的方法,主要是为了测试/分离关注点。你有三件事 - 数据库持久性,文件编写和IIS工作。那对我来说应该是三种不同的服务。我希望你的“WebsiteService”将这些任务委托给其他服务。