2015-01-08 28 views
4

我有一個由3個項目Core,Repository & Web組成的MVC應用程序。2個項目中需要的ViewModel對象核心和Web - 循環依賴

參考如下:

  • 核心引用庫
  • Web引用核心

我的ViewModels坐在Web項目,其中正在使用的控制器。

在Core項目中,我有一個電子郵件類,我想接收綁定的ViewModel對象作爲參數(發送記錄的HTML電子郵件)。

問題是我不能使用該對象作爲email方法中的參數,因爲它會創建一個循環依賴項。

任何想法,我可以在2個項目中立即擁有該對象??

+0

你必須在覈心中使用視圖模型嗎?他們可以不被轉換成域對象,而是通過它們嗎? – Ric

+1

核心不應該對視圖模型有任何依賴性,這些是應用程序級別的對象。如果有*代表這種結構的*商業模型,那麼這將在Core中進行,並且應用層將引用它。 – David

+0

我將它們轉換爲上下文操作的域模型,但我想使用附加到ViewModel的屬性,因爲這些是我可以重現'DisplayName'值的唯一方法。我基本上希望電子郵件在ViewModel中的每個項目都有Label,Field。 – JimmyB

回答

2

聽起來好像視圖模型持有域信息,它不應該這樣做。具體來說,它代表了屬於Core的數據結構,因爲Core具有需要它的功能。這個

兩種主要方法有:

  1. 創建一個核心模型和視圖模型可以有一個模型的屬性。
  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 

事實上,你可能甚至需要在所有和公正的綁定視圖模型該域對象的視圖。但如果不瞭解更多情況,這很難說。

正如您所發現的,依賴關係只應將內部的指向域核心。 (實際上,Repository引用也是向後的,但這超出了問題的範圍。)支持它的功能和結構屬於Core,或者功能本身屬於Web。問題中的域的結構有點模糊,所以對於細節很輕描淡寫,但原則是一樣的。

+0

您已經掌握了我目前的情況。我想要ViewModel的原因是DisplayName和屬性值的註釋已經對該對象回合了。我想要接收ViewModel並將其輸出到電子郵件正文中的電子郵件方法正是它在視圖中顯示的方式。謝謝你的幫助!! – JimmyB

2

反思你的建築。您的Core項目不應該以任何方式瞭解有關Web項目的任何事情......即使有可能(不是這樣),它仍然會導致緊密耦合,您應該嘗試通過使用多個項目來防止耦合。

如果您需要將任何內容傳遞給Core函數,它應該是Core可以理解的東西。無論是一些自定義對象,還是簡單的字符串或其他數據類型。

2

在Web項目中,您需要實現將ViewModel電子郵件類別轉換爲核心電子郵件類別的方法。您可以使用映射器(如AutoMapper)或在ViewModel中編寫您自己的轉換函數。完成轉換後,您將傳遞核心電子郵件對象。

+0

所以你會在Core項目中創建一個新模型並將ViewModel映射到那個?當確切的對象已經存在時很難吞嚥,我想要做的就是循環並輸出這些值到電子郵件中...... – JimmyB

1

您的電子郵件類別不應引用回ViewModel。 A ViewModel用於View消耗。

我會將您的viewmodel的值映射回模型並對模型進行操作(並且您的模型應與保存信息的dataservice共置)。爲此,您可以使用Automapper或編寫自己的映射圖層。