我有一些困惑决定在我的MVC项目中存储我的数据类(模型)的位置。我的解决方案通常遵循以下格式:
我的问题是 - 数据类应存储在何处?在传统的MVC项目中,模型显然存储在Web项目的models文件夹中。但是,当我试图通过将问题分成多个项目来保持我的解决方案松散耦合时,数据模型是否应该存储在不同的项目中,比如我的Core项目?
答案 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>