2 个项目核心和 Web 中需要 ViewModel 对象 - 循环依赖
ViewModel object needed in 2 projects Core and Web - Circular Dependancies
我有一个 MVC 应用程序,它由 3 个项目 Core、Repository 和 Web 组成。
参考资料如下:
- 核心参考资源库
- Web 引用核心
我的 ViewModels 位于 Web 项目中,控制器正在使用它们。
在核心项目中,我有一封电子邮件 class,我想接收绑定的 ViewModel 对象作为参数(发送记录的 HTML 电子邮件)。
问题是我不能将该对象用作电子邮件方法中的参数,因为它会产生循环依赖。
知道如何同时在 2 个项目中拥有该对象吗??
重新考虑您的架构。您的 Core
项目不应该以任何方式了解有关 Web 项目的任何信息...即使可能(实际上不是),它仍然会导致紧密耦合,您应该尝试通过使用多个项目来防止这种情况发生.
如果您需要将任何东西传递给 Core 函数,它应该是 Core 理解的东西。可以是一些自定义对象,甚至是简单的字符串或其他数据类型。
在 Web 项目中,您需要实现一种将 ViewModel 电子邮件 Class 转换为核心电子邮件 Class 的方法。您可以使用映射器(如 AutoMapper)或在 ViewModel 中编写您自己的转换函数来完成此操作。完成转换后,您将传递核心电子邮件对象。
您的电子邮件 class 不应引用 ViewModel
。 ViewModel
供 View
消费。
我会将您的视图模型的值映射回模型并对该模型进行操作(并且您的模型应该与保存信息的数据服务位于同一位置)。为此,您可以使用 Automapper 或编写自己的映射层。
听起来视图模型正在保存域信息,它不应该这样做。具体来说,它表示属于 Core 的数据结构,因为 Core 具有需要它的功能。
实现此目的的两种主要方法是:
- 在 Core 中创建一个模型,视图模型可以将该模型作为 属性。
- 在 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。问题中的域结构有点模糊,如果细节不多,请见谅,但原理是一样的。
我有一个 MVC 应用程序,它由 3 个项目 Core、Repository 和 Web 组成。
参考资料如下:
- 核心参考资源库
- Web 引用核心
我的 ViewModels 位于 Web 项目中,控制器正在使用它们。
在核心项目中,我有一封电子邮件 class,我想接收绑定的 ViewModel 对象作为参数(发送记录的 HTML 电子邮件)。
问题是我不能将该对象用作电子邮件方法中的参数,因为它会产生循环依赖。
知道如何同时在 2 个项目中拥有该对象吗??
重新考虑您的架构。您的 Core
项目不应该以任何方式了解有关 Web 项目的任何信息...即使可能(实际上不是),它仍然会导致紧密耦合,您应该尝试通过使用多个项目来防止这种情况发生.
如果您需要将任何东西传递给 Core 函数,它应该是 Core 理解的东西。可以是一些自定义对象,甚至是简单的字符串或其他数据类型。
在 Web 项目中,您需要实现一种将 ViewModel 电子邮件 Class 转换为核心电子邮件 Class 的方法。您可以使用映射器(如 AutoMapper)或在 ViewModel 中编写您自己的转换函数来完成此操作。完成转换后,您将传递核心电子邮件对象。
您的电子邮件 class 不应引用 ViewModel
。 ViewModel
供 View
消费。
我会将您的视图模型的值映射回模型并对该模型进行操作(并且您的模型应该与保存信息的数据服务位于同一位置)。为此,您可以使用 Automapper 或编写自己的映射层。
听起来视图模型正在保存域信息,它不应该这样做。具体来说,它表示属于 Core 的数据结构,因为 Core 具有需要它的功能。
实现此目的的两种主要方法是:
- 在 Core 中创建一个模型,视图模型可以将该模型作为 属性。
- 在 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。问题中的域结构有点模糊,如果细节不多,请见谅,但原理是一样的。