2010-08-21 80 views
4

我想知道使用NHibernate,AutoMapper和ASP.NET MVC的「最佳實踐」。目前,我使用的:NHibernate,AutoMapper和ASP.NET MVC

class Entity 
{ 
    public int Id { get; set; } 
    public string Label { get; set; } 
} 

class Model 
{ 
    public int Id { get; set; } 
    public string Label { get; set; } 
} 

實體和模型映射這樣的:

Mapper.CreateMap<Entity,Model>(); 
Mapper.CreateMap<Model,Entity>() 
    .ConstructUsing(m => m.Id == 0 ? new Entity() : Repository.Get(m.Id)); 

和Controller:

public ActionResult Update(Model mdl) 
{ 
    // IMappingEngine is injected into the controller 
    var entity = this.mappingEngine.Map<Model,Entity>(mdl); 

    Repository.Save(entity); 

    return View(mdl); 
} 

這是正確的,還是可以提高?

+0

好吧,想想你的項目,以及所有t他的東西,你將需要實施,如果這種方法會造成你的任何問題 – Omu 2010-08-23 05:43:43

回答

1

是如何我在一個項目在做'S:

public interface IBuilder<TEntity, TInput> 
{ 
    TInput BuildInput(TEntity entity); 
    TEntity BuildEntity(TInput input); 
    TInput RebuildInput(TInput input); 
} 

實現這個接口爲每個實體或/和一些一組實體可以做一個通用的實體並在每個控制器中使用它;使用IoC;

你把你的映射代碼放在前2個方法中(無需考慮映射技術,你甚至可以手工完成) 和RebuildInput用於當你獲得ModelState.IsValid == false時,只需調用再次BuildEntity和BuildInput。

,並在控制器中使用:

 public ActionResult Create() 
     { 
      return View(builder.BuildInput(new TEntity())); 
     } 

     [HttpPost] 
     public ActionResult Create(TInput o) 
     { 
      if (!ModelState.IsValid) 
       return View(builder.RebuildInput(o)); 
      repo.Insert(builder.BuilEntity(o)); 
      return RedirectToAction("index"); 
     } 

我真的這樣做是用於多個實體 喜歡這裏有時通用控制器:asp.net mvc generic controller

編輯: 你可以看到在這個技術一個asp.net mvc示例應用程序在這裏: http://prodinner.codeplex.com