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

时间:2014-05-29 19:06:39

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

我有一些困惑决定在我的MVC项目中存储我的数据类(模型)的位置。我的解决方案通常遵循以下格式:

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

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

2 个答案:

答案 0 :(得分:2)

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

这不是一项要求,您可以轻松地将它们保存在单独的程序集中。

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

答案 1 :(得分:1)

一般来说,如果您想在另一个项目中重用核心库,我会保留核心库中的所有内容。使用这种方法,您可以隔离您的"域"模型(http://en.wikipedia.org/wiki/Domain_model)只是核心层,只有特定于网络的功能才会出现在你的网站上。

让我们在您希望用户登录的网站上说,但在winforms应用程序上,身份验证将由登录电脑的用户处理。

您可以将它放在您的网站中,并在不同的应用程序中完全单独处理身份验证,而不将其放在您的域模型中。

然后,您只能在核心库中保留特定于域的模型。

然后,您将创建数据模型,这些模型可以包装核心实体,也可以创建自己的组合实体表示。然后,您可以使用模型中的数据来控制输出。

编辑:这是一个示例设置(虽然冗长,我尽可能简短地说明分离)。

//--------------- 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>