我有一个MVC应用程序,包含3个项目Core,Repository&网页。
参考文献如下:
我的ViewModel位于Web项目中,由控制器使用。
在Core项目中,我有一个电子邮件类,我希望将绑定的ViewModel对象作为参数接收(发送记录的HTML电子邮件)。
问题在于我无法将该对象用作电子邮件方法中的参数,因为它会创建循环依赖。
我是如何在两个项目中同时拥有该对象的?
答案 0 :(得分:2)
重新思考你的架构。你的Core
项目不应该知道关于Web项目的任何方式......即使它是可能的(它不是),它仍然会导致紧耦合你应该试图通过使用来防止多个项目。
如果您需要将任何内容传递给Core函数,它应该是Core理解的东西。可以是一些自定义对象,甚至是简单的字符串或其他数据类型。
答案 1 :(得分:2)
在Web项目中,您需要实现一种将ViewModel电子邮件类转换为核心电子邮件类的方法。您可以使用映射器(如AutoMapper)执行此操作,也可以在ViewModel中编写自己的转换函数。完成转换后,您将传递Core Email对象。
答案 2 :(得分:2)
听起来视图模型正在保存域信息,而不应该这样做。具体来说,它表示属于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
实际上,可能根本不需要视图模型,只需将视图绑定到域对象即可。但如果不了解更多内容,那真的很难说。
正如您所发现的,依赖关系应该只将向内指向域核心。 (实际上,Repository引用也是向后的,但这超出了问题的范围。)支持它的功能和结构都属于Core,或者功能本身属于Web。问题中域名的结构有点模糊,如果对细节有所了解,那就很抱歉,但原理是一样的。
答案 3 :(得分:1)
您的电子邮件类不应该引用回ViewModel
。 ViewModel
用于View
。
我会将viewmodel的值映射回模型并对模型进行操作(您的模型应该与保存信息的dataservice共存)。为此,您可以使用Automapper或编写自己的映射层。