查看2个项目Core和Web中所需的模型对象 - 循环依赖关系

时间:2015-01-08 16:38:49

标签: c# asp.net-mvc

我有一个MVC应用程序,包含3个项目Core,Repository&网页。

参考文献如下:

  • 核心参考资料库
  • Web引用Core

我的ViewModel位于Web项目中,由控制器使用。

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

问题在于我无法将该对象用作电子邮件方法中的参数,因为它会创建循环依赖。

我是如何在两个项目中同时拥有该对象的?

4 个答案:

答案 0 :(得分:2)

重新思考你的架构。你的Core项目不应该知道关于Web项目的任何方式......即使它是可能的(它不是),它仍然会导致紧耦合你应该试图通过使用来防止多个项目。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

两种主要方法是:

  1. 在Core中创建模型,视图模型可以将该模型作为属性。
  2. 在Core中创建模型,视图模型可以复制其结构。 (这可能涉及两者之间的转换方法。)
  3. 在任何一种情况下,如果你有一个属于核心的模型,那么在那里构建它。

    那是什么型号?根据描述,我真的不能确定。现在我打算称它为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)

您的电子邮件类不应该引用回ViewModelViewModel用于View

我会将viewmodel的值映射回模型并对模型进行操作(您的模型应该与保存信息的dataservice共存)。为此,您可以使用Automapper或编写自己的映射层。