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

C# ASP.NET MVC解决方案中模型类的存储位置?,c#,.net,asp.net-mvc,visual-studio,C#,.net,Asp.net Mvc,Visual Studio,我在决定MVC项目中数据类(模型)的存储位置时有些困惑。我的解决方案通常遵循以下格式: 解决方案名称 ProjectName.Web(项目) 控制器 模型 剧本 观点 ProjectName.Core(项目) 服务 接口 模型 存储库(项目)-包含存储库(数据库、XML存储) 测试(项目)-包含单元测试 我的问题是-数据类应该存储在哪里?在传统的MVC项目中,模型显然存储在web项目的models文件夹中。但当我试图通过将关注点分离到多个项目来保持解决方案的松散耦合时,如果数据模

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

  • 解决方案名称
    • ProjectName.Web(项目)
      • 控制器
      • 模型
      • 剧本
      • 观点
    • ProjectName.Core(项目)
      • 服务
      • 接口
      • 模型
    • 存储库(项目)-包含存储库(数据库、XML存储)
    • 测试(项目)-包含单元测试

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

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

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


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

一般来说,如果您想在另一个项目中重复使用核心库,我会将所有必要的东西都保存在您的核心库中。使用这种方法,您可以将“域”模型()隔离到核心层,并且只有特定于web的功能才会出现在您的网站中

假设在网站上您希望用户登录,但在winforms应用程序上,身份验证将由登录到pc的用户处理

您可以将其仅放在您的网站中,并在不同的应用程序中完全分开处理身份验证,而无需将其放在您的域模型中

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

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

Edit:下面是一个示例设置(虽然很长,但为了说明分离,我尽量简短)。

/--------------在域库中:
公共类数据存储库:IDataRepository{
公共数据存储库(){
}//结束构造函数
公共DataEntity GetData(DataRequest请求){
//基于DataRequest获取数据
返回新的DataEntity();
}//结束函数GetData
}//端类数据存储库
公共类数据请求{
公共字符串请求器{get;set;}
公共字典参数{get;}
}//结束类数据请求
公共类数据实体{
公共字符串名称{get;set;}
公共Guid Id{get;set;}
公共字符串SomeData{get;set;}
}//结束类数据实体
//---------------在您的web库中:
公共类用户请求{
公共字符串用户名{get;set;}
}//结束类UserRequest
公共类着陆页面视图模型{
公共着陆页面视图模型(){
数据=新的DataItemViewModel();
}//结束构造函数
公共void FillData(数据实体){
Data.Name=实体.Name;
Data.DataValue=entity.SomeValue;
Data.ShowValue=!String.IsNullOrWhiteSpace(用户名);
}//结束方法FillData
公共字符串用户名{get;set;}
公共列表消息{get;set;}
公共DataItemViewModel数据{get;set;}
}//结束类LandingPageViewModel
公共类DataItemViewModel{
公共字符串名称{get;set;}
公共字符串数据值{get;set;}
公共bool ShowValue{get;set;}
}//结束类DataItemViewModel
公共类MyController:Controller{
私人IDataRepository_存储库;
公共MyController(IDataRepository存储库){
_存储库=存储库;
}//结束构造函数
公共操作结果登录页(用户请求用户){
ActionResult=null;
DataRequest itemRequest=新DataRequest();
itemRequest.RequestingUser=user.UserName;
DataEntity myEntity=null;
myEntity=\u repository.GetData(itemRequest);
如果(myEntity!=null){
LandingPageViewModel viewModel=新的LandingPageViewModel();
viewModel.UserName=user.UserName;
viewModel.FillData(myEntity);
结果=视图(“着陆页面”,视图模型);
}否则{
结果=视图(“错误”);
}//如果结束/else
返回结果;
}//结束操作登录页
}//最终类MyController
//看来

您是否计划在其他解决方案中重新使用核心项目,例如使用不同的UI(WPF、控制台、WinForms、WebService)?我想这可能会发生,但我目前处理的不是这种情况。我正在处理一个庞大的项目,希望将事情组织起来并清晰地分开(在有意义的地方)。因此,通过将域模型分开,您可以将域模型转换为控制器中的视图模型吗?我知道您只想向视图提供所需的内容,但我经常发现,在很多情况下,我的视图模型都是我的域模型。我不确定我是否想不断地进行重铸而没有任何真正的好处。我不是说你必须创建专用的视图模型,特别是对于类与表匹配的简单CRUD应用程序。但是,如果这些类除了作为视图模型之外还有其他职责,那么它们可能应该在单独的项目中。专用视图模型确实为更复杂的场景提供了好处。它们允许组合来自多个实体的数据、数据转换(如视图特定格式),防止意外延迟加载或序列化代理int