我們正在編寫一個MVC數據維護應用程序,它是大型項目的一部分。我們嘗試使用域驅動設計DDD。 關於此問題,已有其他問題,如here,here和here。 但他們並沒有完全回答我的問題。如何處理MVC ViewModel - 域模型 - MVC控制器和服務中的實體
由於數據庫有755個表,我們在數據層中也有有界的上下文。因此,我們爲商業,角色,產品,客戶等創建了有界的上下文。
我們遇到的問題是,在MVC應用程序中,我們有一個「初始設置」視圖,它使用ViewModel,最終跨越多個有界上下文(在實體框架6中使用IUnitOfWork模式)。 因此,該視圖必須寫入業務上下文和角色上下文。
該域模型將有一個Business
模型和一個Address
模型和一些更大的pbject圖中的其他模型。
的視圖模型是這兩個和其他領域模型的扁平化,簡化模型:
public class InitialSetupViewModel
{
string BusinessName{get;set;}
string Street{get;set;}
string Street2{get;set;}
string State{get;set;}
string ZIP{get;set;}
...
}
這個視圖模型應該映射到域模型,我們正在與Automapper做。
的控制器獲得注入的域名服務:
public class SetupController : Controller
{
private readonly IMaintenanceService service;
public SetupController(IMaintenanceService maintenanceService = null)
{
service = maintenanceService;
}
public void Create(...????....)
{
service.CreateBusiness(..?.);
}
}
問題:
的服務無法瞭解
InitialSetupViewModel
,所以什麼應該被傳遞到服務?該服務必須知道有關
BusinessDbContext
和RolesDbContext
。所以我必須在兩者上調用SaveChanges(),這樣才能勝任一個IUnitOfWork的目的。 我是否還需要創建另一個包含業務和角色實體的UnitOfWork?
我不認爲這是合理的,以這兩個IUnitOfWorks合併成一個只是爲了讓這個MVC視圖的工作。但是,解決方案是什麼?
謝謝!
您在控制器上的'Create'動作方法會接受您的視圖模型,然後您將轉換爲DTO並將其傳遞給您的服務 – 2014-12-01 21:22:41
對於我來說,單個應用事務跨越多個有界上下文的事實表明設計異味。聚合之間有多種方式進行事後溝通,可能屬於不同的BC,但交易應儘可能多地修改一個聚合。 – guillaume31 2014-12-02 10:35:59