我有一个包含以下文件夹的 asp.net-mvc 网站:
- 控制器
- 脚本
- 意见
- 视图模型
- 楷模
- 领域模型
我现在想在另一个 .net 应用程序(一个 Windows 控制台应用程序,所以根本不是 Web)中访问很多这种业务逻辑和数据库访问代码和数据,所以我正在重构以尽可能多地删除 MVC 项目之外的东西和到解决方案中的其他项目中,以便可以与其他解决方案共享代码。
我有两个主要问题;
我的主要问题是我正在努力寻找一个放置生成 ViewModel 的代码的地方,因为我想在我的控制台应用程序中重用这些代码,因为控制台应用程序发送的电子邮件需要与看法。
另一个主要问题是,当我的许多实例化我的视图模型的函数都以一堆数据库访问代码开始时,我正在努力了解如何将我的数据库访问代码移出 MVC 项目,同时仍然拥有 ViewModel。
这是到目前为止的一些细节和我的过程:
第 1 步 - 将 DomainModel 移动到另一个项目中 - 成功
所以移动 DomainModel 项目很简单(因为那是很多原始对象,上面有一些业务逻辑 - 没有关于它的网络)。
第 2 步 - 精简控制器 - 成功
我已经尽可能地精简了我的控制器,并将任何业务逻辑或复杂的数据访问逻辑移到了 Models 文件夹中。当我尝试将模型文件夹移到 MVC 项目之外时,出现了一些问题:
第 3 步 - 尝试将模型文件夹移到 MVC 项目之外 - 挣扎
在细化控制器时,我有许多不同的控制器操作,它们转到模型类并返回我传递回视图的 ViewModel。像这样的东西(在我的控制器类中):
public ActionResult ApplicationDetail(int id)
{
AppDetailViewModel applicationViewModel = Model.GenerateAppDetailViewModel(id);
return View(applicationViewModel);
}
所以我的模型文件夹中的文件依赖于 ViewModel 类。我确实想集中 GenerateAppDetailViewModel() 函数,因为它在多个不同的控制器中使用。此外,在我的控制台应用程序(发送电子邮件)中,我经常想要获取恰好在某个视图上的所有数据,所以我的代码也“想要”利用视图模型......如果我将它移出 MVC 项目然后我可以重用,但我认为存在依赖问题(显然我的控制台应用程序中不需要 SelectListItem,但在其他情况下,它们只是生成我想要重用的视图所需的不同数据的容器对象)
或者另一件事是依赖于:
System.Web.Mvc
因为我有很多代码:
- 查询数据库中的表
- 将其转换为对象集合(我正在使用 nhibernate)
- 将其转换为某个 DTO 对象(位于 ViewModels 文件夹中)或 SelectListItem 对象列表(用于填充视图中的下拉菜单),这是 System.web.mvc 的一部分。
我想寻找关于打破这种依赖关系的最佳方法的建议,以便我可以将尽可能多的代码移出 MVC 项目以供重用。
问题是,如果我尝试将 ViewModel 代码吸入 Model 文件夹并进入另一个项目,那么我再次陷入困境,因为 ViewModel 类对
系统.Web.Mvc
由于 SelectListItem 之类的原因。
我应该有 2 个视图模型文件夹(一个在 MVC 项目中具有特定的 system.web.mvc 引用,另一个位于不同的项目中?)。似乎对 SelectListItem 的依赖是导致争用的原因
在我见过的大多数示例中,ViewModel 确实依赖于 System.Web.Mvc ,例如本教程
我看过这些问题:
这有点相关,但不确定它们是否回答了我所说的具体的整体重构问题。