簡體   English   中英

在ASP.NET MVC解決方案中存儲模型類的位置?

[英]Where to store model classes in ASP.NET MVC solution?

我有一些困惑決定在我的MVC項目中存儲我的數據類(模型)的位置。 我的解決方案通常遵循以下格式:

  • 解決方案名稱
    • ProjectName.Web(項目)
      • 控制器
      • 楷模
      • 腳本
      • 查看
    • ProjectName.Core(項目)
      • 服務
      • 接口
      • 楷模
    • ProjectName.Repositories(項目) - 包含存儲庫(數據庫,XML存儲)。
    • ProjectName.Test(project) - 包含單元測試。

我的問題是 - 數據類應該存儲在哪里? 在傳統的MVC項目中,模型顯然存儲在Web項目的models文件夾中。 但是,當我試圖通過將問題分成多個項目來保持我的解決方案松散耦合時,數據模型是否應該存儲在不同的項目中,比如我的Core項目?

查看僅為向MVC視圖提供數據而設計的模型類應位於ProjectName.Web項目中根據標准ASP .NET MVC約定的Models文件夾。

這不是一個要求,您可以輕松地將它們保存在單獨的程序集中。

如果您正在討論域模型,ORM實體或包含數據的任何類型的非UI類; 那些可能屬於一個單獨的項目。

一般來說,如果你想在另一個項目中重用核心庫,我會保留核心庫中的所有內容。 使用這種方法,您可以將“域”模型( http://en.wikipedia.org/wiki/Domain_model )隔離到核心層,只有特定於Web的功能才會出現在您的網站中。

假設您希望用戶登錄網站,但在winforms應用程序中,身份驗證將由登錄到PC的用戶處理。

您可以將它放在您的網站中,並在不同的應用程序中完全單獨處理身份驗證,而無需將其放在您的域模型中。

然后,您將只在核心庫中保留特定於域的模型。

然后,您將創建數據模型,以包裝核心實體,或者它們自己的組合實體表示。 然后,您可以使用模型中的數據來控制輸出。

編輯:這是一個示例設置(雖然冗長,我盡可能簡短地說明分離)。

//--------------- In your domain library:

public class DataRepository : IDataRepository {

    public DataRepository() {
    } // end constructor

    public DataEntity GetData(DataRequest request) {
        //get data based on DataRequest
        return new DataEntity();
    } // end function GetData
} // end class DataRepository

public class DataRequest {

    public String RequestingUser {get; set;}

    public Dictionary<String, object> Parameters {get;}

} // end class DataRequest

public class DataEntity {

    public string Name {get; set;}
    public Guid Id {get; set;}
    public string SomeData {get; set;}

} // end class DataEntity

//--------------- In your web library:

public class UserRequest {

    public string UserName {get; set;}

} // end class UserRequest

public class LandingPageViewModel {

    public LandingPageViewModel() {
        Data = new DataItemViewModel();
    } // end constructor

    public void FillData(DataEntity entity) {
         Data.Name = entity.Name;
         Data.DataValue = entity.SomeValue;
         Data.ShowValue = !String.IsNullOrWhiteSpace(UserName);
    } // end method FillData

    public string UserName {get; set;}

    public List<string> Messages {get; set;}

    public DataItemViewModel Data {get; set;}

} // end class LandingPageViewModel

public class DataItemViewModel {

    public string Name {get; set;}
    public string DataValue {get; set;}

    public bool ShowValue {get; set;}

} // end class DataItemViewModel

public class MyController : Controller {

    private IDataRepository _repository;

    public MyController(IDataRepository repository) {
        _repository = repository;
    } // end constructor

    public ActionResult LandingPage(UserRequest user) {
        ActionResult result = null;
        DataRequest itemRequest = new DataRequest();
        itemRequest.RequestingUser = user.UserName;
        DataEntity myEntity = null;
        myEntity = _repository.GetData(itemRequest);
        if(myEntity != null) {
           LandingPageViewModel viewModel = new LandingPageViewModel();
           viewModel.UserName = user.UserName;
           viewModel.FillData(myEntity);
           result = View("LandingPage", viewModel);
        } else {
           result = View("Error");
        } // end if/else
        return result;
    } // end action LandingPage
} // end class MyController


// In a view

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of LandingPageViewModel)" %>
<div>
    <%:Model.Name;%>
    <%
        if(Model.ShowValue) {
    %>
        <%:Model.DataValue;%>
    <%
        } // end if
    %>
</div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM