繁体   English   中英

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

[英]ASp.NET MVC - Is it possible to simplify my architecture?

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

好的,这是我的设置:

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

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

UI - 我的MVC解决方案

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

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

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

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

谢谢

理想情况下,一方面需要与域模型分离 ,另一方面需要与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>();

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

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

我希望这有帮助。

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

http://fluentvalidation.codeplex.com/

您可以完美地向BLL( 业务实体 )添加属性。 只需添加引用并为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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM