ASp.NET MVC - 是否可以简化我的架构

本文关键字:我的 NET MVC 是否 ASp | 更新日期: 2023-09-27 18:32:57

我刚刚开始做一个MVC项目,一切进展顺利,但看起来我正在用太多的对象创建很多意大利面条代码。任何人都可以看到我如何在整个项目失控之前简化此解决方案吗?

好的,这是我的设置:

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

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

UI - 我的 MVC 解决方案

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

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

任何人都可以看到如何将我当前的模型类库与使用验证注释的 MVC 模型对象一起使用吗?

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

谢谢

ASp.NET MVC - 是否可以简化我的架构

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

在大多数情况下,这些看起来非常相似,尽管 ViewModel 可以包含额外的内容。然后,您可以使用自动映射器从一个转换为另一个。

例如:

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>();

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

[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 对象。 属性指示将用于保存元数据的类。 然后,您只需创建与实际数据成员的名称匹配的普通对象并对其进行批注。

我希望这有所帮助。

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

http://fluentvalidation.codeplex.com/

您可以完美地将属性添加到 BL(业务实体(。只需添加一个引用并为System.ComponentModel.DataAnnotations添加一个 using 语句。除此之外,您还可以实现IValidatableObject接口(这非常简单,见下文(。

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

验证示例:

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