【问题标题】:Where to store model classes in ASP.NET MVC solution?在 ASP.NET MVC 解决方案中将模型类存储在哪里?
【发布时间】:2014-05-29 19:06:38
【问题描述】:

在决定将数据类(模型)存储在 MVC 项目中的何处时,我有些困惑。我的解决方案一般遵循以下格式:

  • 解决方案名称
    • ProjectName.Web(项目)
      • 控制器
      • 型号
      • 脚本
      • 观看次数
    • ProjectName.Core(项目)
      • 服务
      • 接口
      • 型号
    • ProjectName.Repositories(项目)- 包含存储库(数据库、XML 存储)。
    • ProjectName.Test(项目)- 包含单元测试。

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

【问题讨论】:

  • 您是否计划在其他解决方案中重新使用 Core 项目,例如使用不同的 UI(WPF、控制台、WinForms、WebService)?
  • 我想这可能会发生,但我目前正在处理的情况并非如此。我正在处理一个庞大的项目,并希望使事情井井有条并清晰地分开(在有意义的地方)。

标签: c# .net asp.net-mvc visual-studio


【解决方案1】:

根据标准 ASP .NET MVC 约定,仅设计用于向 MVC 视图提供数据的视图模型类应位于 ProjectName.Web 项目 Models 文件夹中。

但这不是必需的,您可以轻松地将它们保存在单独的程序集中。

如果您谈论的是域模型、ORM 实体或任何类型的包含数据的非 UI 类;这些可能属于一个单独的项目。

【讨论】:

  • 那么在保持域模型分离的情况下,您会将域模型转换为控制器中的视图模型吗?我了解您只想准确地向视图提供所需的内容,但我经常发现我的视图模型在很多情况下都是我的域模型。我不确定我是否想不断地重铸没有真正的好处。
  • 我并不是说您必须创建专用的视图模型,尤其是对于类匹配表的简单 CRUD 应用程序。但是,如果这些类除了作为视图模型之外还有其他职责,那么它们可能应该在一个单独的项目中。
  • 专用视图模型确实为更复杂的场景提供了好处。它们允许组合来自多个实体的数据、数据转换(例如视图特定格式)、防止意外延迟加载或在 ORM 场景中将代理序列化为 JSON 等。还有像 Automapper 这样的工具可以轻松地在不同模型之间复制数据。
  • 有道理。所以我不会因为使用域模型作为视图模型而违反任何合理的编码原则?
  • 拥有单独的视图模型通常是一种很好的做法。但如果他们没有提供太多好处,我不会太担心。
【解决方案2】:

一般来说,如果您想在另一个项目中重新使用核心库,我会将所有必要的东西都保留在您的核心库中。使用这种方法,您可以将您的“域”模型 (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>

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2013-12-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多