2012-08-22 47 views
5

我想在我的.NET MVC 3應用程序上實現這個Command Pattern,專門用於保存對Thing的編輯。我不確定如何繼續。之前,我實際的問題,這裏是簡化代碼:.NET MVC 3中的命令模式(從控制器中刪除垃圾)

public class ThingController 
{ 
    private readonly ICommandHandler<EditThingCommand> handler; 

    public ThingController(ICommandHandler<EditThingCommand> handler) 
    { 
     this.handler = handler; 
    } 

    public ActionMethod EditThing(int id) 
    { 
     ...build EditThingViewModel and return with View... 
    } 

    [HttpPost] 
    public ActionMethod EditThing(int id, EditThingViewModel vm) 
    { 
     var command = new EditThingCommand 
     { 
      ...not sure yet... 
     }; 

     this.handler.Handle(command); 

     ...redirect somewhere... 
    } 
} 

我EditThingViewModel是從我的域名,其中包括POCO類的完全斷開。這似乎是我的EditThingCommand應該是這樣的:

public class EditThingCommand 
{ 
    Thing ModifiedThing; 
} 

然而,建立ModifiedThing隨後將仍然可以在我的控制器發生。這是這種情況下的主要工作。在修改ModifiedThing的時間(以及應用於它的「舊」時間戳以進行樂觀併發檢查)時,剩下的就是命令在我的數據上下文中調用Update。

很明顯,能夠用其他命令輕鬆裝飾它是有價值的,但是我也希望能夠將我的控制器之外的ModifiedThing的構造移動到外面。 (也許這個問題其實就是這個問題。)EditThingCommand在我的域中,沒有對EditThingViewModel的引用,所以它不能去那裏。 在我的表示層中有另一個命令將我的viewmodel映射到我的poco實體是否有意義?

+0

我會建議看看Paul Stovell的文章清理ASP.NET MVC控制器在http://www.paulstovell.com/clean-aspnet-mvc-controllers發現 –

+0

感謝您的建議! –

回答

0

在其他項目上使用該模式幾個月後,對我來說很明顯這個特定項目上的命令太簡單,因此太複雜,需要太多的設置。例如,創建一個EditThingTitleCommand和一個MoveThingPiecesCommand等等,並從他們自己的ActionMethods中調用它們會更好。

換句話說,當使用命令模式時,不要僅僅使用這些命令作爲典型CRUD操作的替代品。隨着更多的特異性更有利。

0

我在我的域之外創建了一個EditThingPostCommand,它將EditThingViewModel作爲參數。 EditThingPostCommandHandler負責創建EditThingCommand並調用其處理程序。

它的工作原理,但我不會認爲這是我的問題的最佳答案。可以說EditThingPostCommandHandler所做的大部分工作都可以在自定義AutoMapper配置中完成,這仍然可以用於清理控制器操作方法。