2013-04-14 16 views
4

我一直在想如何處理MVC解決方案中的ViewModels。我認爲,在閱讀不同的帖子和博客後,最好的方法是讓構建者實現一個接口,然後將這些接口注入控制器本身。MVC中ViewModel構建器的接口

使用automapper我會在每個構建器的實現中做實體和視圖模型之間的映射,並且控制器將保持非常精簡。

所以我創建這個接口

public interface IViewModelBuilder<TViewModel, TEntity> 
{ 
    TViewModel Build(TEntity entity); 
} 

因爲我忽略有關使它們協變和逆變的警告時刻(如果那是需要不知道)。

對於一個特定的ViewModel,雖然我需要從兩個不同的服務中獲取兩個實體,所以我不知道應該傳遞什麼類型的參數。

public class ConcreteVMBuilder: IViewModelBuilder<concreteVM, ????> 

也許該界面不正確?

我明白合併在控制器中獲取的兩個實體不是一個乾淨的解決方案,對嗎?

如果有人可以幫我個忙,我將非常感謝

回答

4

關於做注射式嵌套類虛擬機的是什麼?

例如像

public class SomeViewModelBuilder : IViewModelBuilder<SomeViewModelBuilderArgs> 
{ 
    public class SomeViewModelBuilderArgs 
    { 
     public SomeEntity Entity1 { get; private set; } 
     public SomeOtherEntity Entity2 { get; private set; } 

     public SomeViewModelBuilderArgs(Entity1 someEntity, Entity2 someOtherEntity) 
     { 
      SomeEntity = someEntity; 
      SomeOtherEntity = someOtherEntity; 
     } 
    } 

    public SomeViewModel Build(SomeViewModelBuilderArgs) 
    { 
     // Do work 
     return new SomeViewModel(); 
    } 
} 

然後打電話給你的標準接口來注入實體:

builderInterface.Build(new SomeViewModelClass.SomeViewModelBuilderArgs(ent1, ent2)); 

是否幫助呢?

編輯:另外 - 是否有任何需要的第一個通用參數,因爲界面甚至沒有使用它?

編輯2:哦,我不好,你正在返回它 - 忽略最後的評論!

+0

嗨Charleh,謝謝你的評論。這個或多或少是我所指的選項,將它們合併到另一個模型中,現在你已經「編碼」了它對我來說看起來不那麼糟糕。我想到的另一個選擇是將userId(這是我用於提取兩個實體的那個,我錯過了我的問題中的那個重要部分)傳遞給構建器。在這種情況下,我將獲取其中的實體,而不是在控制器中這樣做,因此我需要注入類來調用服務,這是否有意義? – mitomed

+0

是的兩種方法都應該可以工作 - 說實話,關於注入參數而不是實際實體的想法更符合我將要做的事情。這種方式取決於收集所需實體數據以構建虛擬機的「構建者」 - 這與我在其中一個項目中採用的方法幾乎完全相同,不同之處在於虛擬機自身構建(實例化通過容器完成並且然後注入參數,虛擬機自行設置 - 構建器只是打包構建調用) – Charleh