在ASP中存储模型类的位置..NET MVC解决方案

本文关键字:位置 NET MVC 解决方案 ASP 存储 模型 | 更新日期: 2023-09-27 18:05:43

我有一些混淆决定在哪里存储我的数据类(模型)在我的MVC项目。我的解决方案通常遵循以下格式:

  • SolutionName
    • ProjectName。Web(项目)
        <
      • 控制器/gh>
      • <
      • 脚本/gh>
    • ProjectName。核心(项目)
    • ProjectName。存储库(项目)-包含存储库(数据库,XML存储)。
    • ProjectName。测试(项目)-包含单元测试。

我的问题是-数据类应该存储在哪里?在传统的MVC项目中,模型显然是存储在web项目的models文件夹中。但是,当我试图通过将关注点分离到多个项目中来保持解决方案的松散耦合时,数据模型是否应该存储在不同的项目中,比如我的Core项目?

在ASP中存储模型类的位置..NET MVC解决方案

根据标准asp.net MVC约定,仅为向MVC视图提供数据而设计的视图模型类应该位于ProjectName.Web项目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>