我刚刚开始研究一个MVC项目,事情进展顺利,但看起来我正在用太多的对象创建很多意大利面条代码。在整个项目失控之前,谁能看到我如何简化这个解决方案呢?
好的,这是我的设置:
DAL - 有实体框架连接和方法来获取数据然后将数据转换为模型层中的模型对象
BLL - 将数据发送回UI 模型 - 它包含整个站点中使用的所有模型对象,通过创建新对象然后填充变量,将来自DAL的任何内容转换为这些对象。
用户界面 - 我的MVC解决方案
DAL,BLL和Model也被其他解决方案使用。
现在使用MVC,我正在尝试使用验证注释([Required]等),这意味着我必须使用注释重新创建模型对象。这很好,但如果我想将数据保存回数据库,我需要转换那些乱糟糟的类。
有谁能看到我如何将当前的模型类库与使用验证注释的MVC模型对象一起使用?
如果我没有清楚地解释清楚,请告诉我,我会提供更多细节。
由于
答案 0 :(得分: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>();
答案 1 :(得分: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属性指示将用于保存元数据的类。然后,您只需创建与实际数据成员的名称匹配的纯对象,并对其进行注释。
我希望这会有所帮助。
答案 2 :(得分:0)
您可以使用FluentValidation框架进行验证。看这里
答案 3 :(得分:0)
您可以完美地为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;