簡體   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