2 个项目核心和 Web 中需要 ViewModel 对象 - 循环依赖

ViewModel object needed in 2 projects Core and Web - Circular Dependancies

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

参考资料如下:

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

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

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

知道如何同时在 2 个项目中拥有该对象吗??

重新考虑您的架构。您的 Core 项目不应该以任何方式了解有关 Web 项目的任何信息...即使可能(实际上不是),它仍然会导致紧密耦合,您应该尝试通过使用多个项目来防止这种情况发生.

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

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

您的电子邮件 class 不应引用 ViewModelViewModelView 消费。

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

听起来视图模型正在保存域信息,它不应该这样做。具体来说,它表示属于 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

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

正如您所发现的,依赖项应该只向内指向域核心。 (事实上​​,存储库引用也是向后的,但这超出了问题的范围。)支持它的功能和结构属于核心,或者功能本身属于 Web。问题中的域结构有点模糊,如果细节不多,请见谅,但原理是一样的。