C# 如何在MVC项目外部重构数据库访问代码,但将viewmodels保留在内部?
我有一个asp.net-mvc网站,其中包含以下文件夹:C# 如何在MVC项目外部重构数据库访问代码,但将viewmodels保留在内部?,c#,asp.net-mvc,model-view-controller,refactoring,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Model View Controller,Refactoring,Asp.net Mvc Viewmodel,我有一个asp.net-mvc网站,其中包含以下文件夹: 控制器 剧本 观点 视图模型 模型 域模型 我现在想在另一个.net应用程序(一个完全不是web的windows控制台应用程序)中访问大量的业务逻辑和数据库访问代码和数据,因此我正在重构,以尽可能多地删除MVC项目之外的内容,并将其放入解决方案中的其他项目中,以便与其他解决方案共享代码 我有两个主要问题 我的主要问题是,我正在努力找到一个地方来放置生成ViewModel的代码,因为在控制台应用程序发送电子邮件时,我希望在控制台应用程序
- 控制器
- 剧本
- 观点
- 视图模型
- 模型
- 域模型
System.Web.Mvc
因为我有很多代码:
它们有点相关,但不确定它们是否回答了我提出的具体整体重构问题。您可以使用扩展方法在controller中创建viewmodels: 控制器:
public ActionResult ApplicationDetail(int id)
{
var model = _serviceLayer.GetSomeModel(id);
var viewModel = model.CreateInstance(model);
return View(viewModel);
}
在mvc项目中创建此SomeModelExtensions
public class SomeModelExtensions {
public AppDetailViewModel CreateInstance(this SomeModel model) {
var viewModel = new AppDetailViewModel();
// here you create viewmodel object from model with logic
return viewModel;
}
}
视图模型是特定于特定应用程序的。我猜web应用程序和控制台应用程序之间的视图模型会有所不同。因此,请让每个应用程序定义自己的视图模型以及域模型和视图模型之间的对应映射。不要让域模型拥有将em用于查看模型,因为这样做会将域层完全绑定到UI层,这是最糟糕的情况。使用映射层(特定于每种应用程序类型)。这是映射层的一个很好的示例 甚至不要尝试在控制台应用程序中重用ASP.NET MVC视图模型。正如您已经发现的那样,它们将包含对System.Web.MVC的引用,因为例如ASP.NET MVC中的dropDownList用
IEnumerable
类表示,而在控制台应用程序中,天知道,可能是IEnumerable
结论:视图模型以及域和视图模型之间的来回映射属于UI层(也称为ASP.NET MVC、Console、WPF等)。我假设MVC web将使用与Console应用程序+额外字段相同的数据,对吗 那么,如何从模型继承ViewModel呢?这样您就可以重用模型并根据需要在ViewModel上获取自定义字段
public class AppDetailModel
{
public int ID { get; set; }
public string Name { get; set; }
}
public class AppDetailViewModel : AppDetailModel
{
public string ViewProperty { get; set; }
}
通常,我在设计MVC应用程序时使用以下设置/架构,其中可能需要重用模型: MVC项目:所有与web相关的内容。我在这里定义ViewModels并将它们映射到域模型 模型项目:包含所有域逻辑的类库 存储库项目:这是一个类库,用于访问数据库和域模型 它的工作方式是MVC项目将使用(希望是注入的)存储库库
public class AppDetailModel
{
public int ID { get; set; }
public string Name { get; set; }
}
public class AppDetailViewModel : AppDetailModel
{
public string ViewProperty { get; set; }
}
MVC App Console App
| |
| |
MVC Specific Mapper Console Specific Mapper
\ /
\ /
\ /
GenericMapper <- EmailMapper and EmailViewModel can be implemented here
| |
| |
Repository |
| |
| |
DomainModels