2 个项目核心和 Web - 循环依赖项中所需的视图模型对象

本文关键字:视图 对象 模型 依赖 核心 项目 Web 循环 | 更新日期: 2023-09-27 18:36:50

我有一个MVC应用程序,由3个项目组成,Core,Repository和Web。

参考资料如下:

  • 核心引用存储库
  • 参考资料 核心

我的 ViewModels 位于 Web 项目中,控制器正在使用这些项目。

在核心项目中,我有一个电子邮件类,我希望接收绑定的 ViewModel 对象作为参数(以发送记录的 HTML 电子邮件)。

问题是我不能将该对象用作电子邮件方法中的参数,因为它会创建一个循环依赖项。

任何想法如何一次在 2 个项目中拥有该对象?

2 个项目核心和 Web - 循环依赖项中所需的视图模型对象

听起来视图

模型正在保存域信息,这是它不应该做的。 具体来说,它表示属于 Core 的数据结构,因为 Core 具有需要它的功能。

实现此目的的两种主要方法是:

  1. 在 Core 中创建模型,视图模型可以将该模型作为属性。
  2. 在 Core 中创建模型,视图模型可以复制其结构。 (这可能涉及两者之间的转换方法。

无论哪种情况,如果你有一个属于核心的模型,那就在那里构建它。

那是什么模式? 根据描述,我真的无法确定。 现在我称之为EmailTemplate. 在这种情况下,听起来你有这个:

Core Assembly
    Email Object
        Send Method (View Model parameter)
Web Assembly
    View Model Object
        properties

相反,您需要以下内容:

Core Assembly
    Email Object
        Send Method (Email Template parameter)
    Email Template Object
Web Assembly
    View Model Object
        Email Template property

事实上,您甚至可能根本不需要视图模型,只需将视图绑定到域对象即可。 但是,如果不了解更多,这真的很难说。

正如你所发现的,依赖项应该只指向域核心。 (事实上,存储库引用也是反向的,但这超出了问题的范围。 要么功能和支持它的结构属于 Core,要么功能本身属于 Web。 问题中的域结构有点模糊,所以很抱歉,如果细节很轻,但原理是一样的。

重新思考你的架构。你的Core项目不应该知道任何关于 Web 项目的事情......即使有可能(事实并非如此),它仍然会导致紧密耦合,您应该尝试通过使用多个项目来防止这种情况。

如果你需要将任何东西传递给 Core 函数,它应该是 Core 理解的东西。一些自定义对象,甚至是简单的字符串或其他数据类型。

在 Web 项目中,您需要实现一种将 ViewModel 电子邮件类转换为核心电子邮件类的方法。 您可以使用映射器(如自动映射器)执行此操作,也可以在 ViewModel 中编写自己的转换函数。完成转换后,传递核心电子邮件对象。

您的电子邮件类不应引用回ViewModelViewModelView使用。

我会将视图模型的值映射回模型并对模型进行操作(并且您的模型应与保存信息的数据服务共置)。为此,您可以使用自动映射器或编写自己的映射图层。