4

我不是经验丰富的 MVC3 开发人员,但我正在努力成为。我熟悉 POCO 类和 ViewModels,因为前者描述了数据库的每个类,而后者用于 mvc3 中的强类型视图。对于有经验的开发人员来说,我的问题并不复杂,但我对此有点困惑。

问题是,我有一个包含三个项目的解决方案;

  1. 我编写 POCO 类的模型类库。这是一个例子:

.

public class Service
    {
        [Key]
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
        public int ServiceID { get; set; }
        //------------------------------------------------------------//
        [Required, MaxLength(30)]
        [LocalizedAttribute("Name")]
        public string Name { get; set; }
        //------------------------------------------------------------//
        [MaxLength(100)]
        [LocalizedAttribute("Description")]
        public string Description { get; set; }
        //------------------------------------------------------------//
        [Required]
        public long ModifiedByUserID { get; set; }
        [ForeignKey("ModifiedByUserID")]
        public virtual User OperatorUser { get; set; }
        //------------------------------------------------------------//
        [Required, MaxLength(10)]
        public int ModifiedDate { get; set; }
    }
  1. 存储库和 UnitOf Work 类库

  2. MVC 应用程序

现在,我是否正确解决了 POCO 课程?(我当然是使用 EF Code First 来生成数据库)如果是,它们是否也被推断为 ViewModels?我用它们来生成强类型视图。

定义 POCO 类和 ViewModel 的最佳且实际标准的方法是什么?

我将不胜感激任何善意的指导,

4

3 回答 3

7

老实说,这取决于您项目的规模。

如果您查看大多数 Microsoft 示例,他们使用 POCO 作为模型只是因为他们的示例是小型项目。

但是,如果您正在开发任何接近企业级应用程序的东西,那么您真的不应该使用您的 POCO 作为模型。应该有明确的关注点分离。严格来说,您的 Web 项目甚至不应该知道这些场景中的 POCO 对象,典型的实现是 POCO 和 View Model 都可以实现和查看的通用接口。这样可以避免将 POCO 对象暴露给 Web 层。

于 2013-06-05T09:45:18.373 回答
3

ViewModel 是数据(Poco)和 View 之间的中间层,通常包含额外的逻辑来控制 UI。

如果 ViewModel 没有任何特定数据,我看不出不使用 Poco 作为 ViewModel 的原因。

在其他情况下,要将数据保留为 Poco,您可以创建具有与 Poco 类相同的字段的 ViewModel,并使用 Automapper 到 Poco->ViewModel、ViewModel->Poco 转换。

于 2013-06-05T08:41:47.133 回答
2

我同意 mt_serg。在我的应用程序中,如果是一个简单的案例,我会直接使用 POCO 类。但是,如果在我看来,我还需要显示例如从数据库填充的下拉列表,那么我创建一个 ViewModel,其中包含带有附加列表的 POCO 类,并在从控制器传入的视图中使用 VM。但是,我不会重做我的工作并使用与 POCO + 附加字段相同的字段创建 VM。我发现这种方法对我有用,因为我不必自己处理转换,我让 MVC 框架为我解决这个问题。希望这可以帮助

于 2013-06-05T09:39:59.350 回答