c# - 通过单独的程序集充分利用 ASP.NET MVC DataAnnotations

标签 c# asp.net-mvc data-annotations

假设我有一个描述领域模型的领域程序集,它有一个名为产品的类:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我还有另一个程序集,它是使用此域模型运行的 Web 应用程序。现在我想创建一个表单来创建新产品并对属性进行一些验证。最简单的方法是在类上使用 DataAnnotations。然而,这会导致域模型现在包含有关表单验证的元数据,这不是一个非常明确的关注点分离。

类可以有 MetadataType 属性,但我认为这并没有什么好处。突然之间,您的域模型类依赖于表单验证元数据类。

另一种方法是创建一个CreateProductForm 类并在其中添加所需的属性,并在类之间进行映射。然而,这会产生一些开销,因为您需要单独维护这些类,并且其中一个的更改可能会破坏另一个。在某些情况下可能需要这样做,但在其他一些情况下,它可能只会产生额外的工作(例如,假设您有一个地址类)。

更新:有些人建议我为此使用 AutoMapper,我已经知道这一点。 AutoMapper 只是使映射更简单、更容易,并没有真正解决必须维护两个几乎相同的独立类的问题。我的偏好是仅在有明显需求时才创建表单类。

有没有一种方法可以直接在 Web 程序集中声明注解,而不会为域程序集创建不必要的依赖项?

最佳答案

如果您不想在域模型和 View 之间引入耦合,您应该采用 CreateProductForm 类的方式。

根据您的项目规模/要求,您迟早必须将 View 模型与域分开。假设您正在使用 DisplayName 属性:您要标记您的域实体吗?

使用像 AutoMapper 这样的工具可以大大简化映射过程。

关于c# - 通过单独的程序集充分利用 ASP.NET MVC DataAnnotations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6342142/

相关文章:

asp.net-mvc-3 - MVC DataAnnotations URL 验证

c# - FormsAuthenticationModule 中的这段代码应该如何工作?

c# - 使用 Asp.Net Identity 更新用户 - 用户名存在

c# - 重载运算符参数的用户定义隐式转换

C#。文档转换为 PDF

asp.net-mvc - 将 BootstrapValidator 与 MVC DataAnnotations 一起使用

c# - System.Net.Sockets 命名空间中缺少 TCPListener

.net - 为什么 Microsoft 的新 .NET 代码不兼容 Microsoft StyleCop?

html - System.Web.Mvc.Html.MvcForm Razor 显示 HTML

c# - 将元数据与 Entity Framework 结合使用以使用数据注释进行验证