7

我刚刚开始从事一个 MVC 项目,一切进展顺利,但看起来我正在使用太多对象创建大量意大利面条代码。谁能看到我如何在整个项目失控之前简化这个解决方案?

好的,这是我的设置:

DAL - 具有实体框架连接和获取数据的方法,然后将数据转换为模型层中的模型对象

BLL - 将数据发送回 UI 模型 - 这包含整个站点使用的所有模型对象,来自 DAL 的任何内容都通过创建新对象然后填充变量转换为这些对象。

UI - 我的 MVC 解决方案

DAL、BLL 和模型也被其他解决方案使用。

现在使用 MVC,我正在尝试使用验证注释([Required] 等),这意味着我必须使用注释重新创建模型对象。这很好,但如果我想将数据保存回数据库,我需要转换那些只是混乱的类。

谁能看到我如何将当前的模型类库与使用验证注释的 MVC 模型对象一起使用?

如果我没有清楚地解释自己,请告诉我,我会提供更多细节。

谢谢

4

4 回答 4

3

理想情况下,一方面需要与域模型分开,另一方面需要与 MVC 模型(它们实际上是ViewModels)分开。这种分离非常重要,强烈建议。

在大多数情况下,这些看起来很相似,尽管 ViewModel 可以包含额外的东西。然后您可以使用AutoMapper从一种转换到另一种。

例如:

public class User // in entity DLL
{
    [Required]
    public string Name {get; set;}
}

public class UserViewModel : User // in MVC DLL
{
    public string LastVisitedPage {get; set;} // which only MVC needs to know
}

Mapper.Map<User, UserViewModel>();
Mapper.Map<UserViewModel, User>();
于 2012-05-03T11:13:46.003 回答
1

您可以将元数据放入元数据对象中,而无需重新创建模型对象。这是一种非常简单的方法,但是它确实需要将模型对象本身标记为部分对象。我希望没关系,如果不是这个解决方案对你不起作用。

[MetadataType(typeof(PreviousResultsMetaData))]
public partial class PreviousResults
{
    public class PreviousResultsMetaData
    {
        [DisplayName("Class Ranking Score")]
        [Required]
        [Range(0.0, 100.0)]
        public object ClassRankingScore { get; set; }
    }
}

在上面的示例中,有一个名为 PreviousResults 的数据模型对象,它是由一些脚手架代码在其他地方创建的。它定义了使用 LINQ 向数据库发送和从数据库发送的 POCO 对象。MetadataType 属性指示将用于保存元数据的类。然后,您只需创建与真实数据成员名称匹配的普通对象并对其进行注释。

我希望这有帮助。

于 2012-05-03T11:16:10.903 回答
0

您可以完美地为您的 BLL(业务实体)添加属性。只需添加一个引用并为System.ComponentModel.DataAnnotations. 除此之外,您还可以实现IValidatableObject接口(这很简单,见下文)。

对于映射,您可以使用例如AutoMapper,因此您不必自己编写很多映射逻辑(如果您可以利用名称映射魔法)。

验证示例:

ICollection<ValidationResult> validationErrors = new List<ValidationResult>();
var validationContext = new ValidationContext(this, null, null);
Validator.TryValidateObject(this, validationContext, ValidationErrors, true);

return validationErrors;
于 2012-05-03T11:16:50.493 回答
0

您可以使用 FluentValidation 框架进行验证。看这里

http://fluentvalidation.codeplex.com/

于 2012-05-03T11:14:07.120 回答