0

我来自一个 WebForms 世界,其中所有逻辑都位于 aspx 页面的代码隐藏中。在阅读了几本关于 ASP.NET MVC 的书籍、听了一些播客并在 Tekpub 上观看了一些视频之后,我决定是时候以不同的方式处理事情了。

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

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

我知道我应该让我的控制器保持精简,所以我想我应该使用某种服务类(我们称之为 WebsiteService)来做到这一点。我正在使用实体框架进行数据访问,并且我的视图都使用特定的视图模型。当我创建或编辑网站时,应该发生以下四件事:

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

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

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

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

1 回答 1

1

对此的答案部分是主观的,见仁见智,但这是我的想法:

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

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

  3. 不,我认为这应该采用单独的方法,主要是为了可测试性/关注点的分离。您已经完成了三件事——数据库持久性、文件写入和 IIS 工作。这对我来说应该是三种不同的服务。我会让您的“网站服务”将这些任务委托给其他服务。

于 2011-02-07T08:48:42.063 回答