2010-08-21 5 views
4

Je m'interroge sur une «meilleure pratique» en utilisant NHibernate, AutoMapper et ASP.NET MVC. À l'heure actuelle, j'utilise:NHibernate, AutoMapper et 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; } 
} 

entité et le modèle sont mis en correspondance comme ceci:

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

Et dans le contrôleur:

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); 
} 

Est-ce exact, ou peut-il être amélioré ?

+0

bien, pensez à votre projet, et tous t Les choses que vous allez devoir mettre en œuvre, et si cette approche va vous créer des problèmes – Omu

Répondre

1

Voilà comment je faisais dans un projet:

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

implémenter cette interface pour chaque entité et/ou pour certains groupe d'entités que vous pourriez faire un générique et l'utiliser dans chaque contrôleur; utiliser IoC;

vous mettez votre code de mappage dans les 2 premières méthodes (peu importe la technologie de cartographie, vous pouvez même le faire à la main) et le RebuildInput est pour quand vous obtenez le ModelState.IsValid == false, appelez simplement BuildEntity et BuildInput à nouveau.

et l'utilisation dans le contrôleur:

 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"); 
     } 

je réellement contrôleur parfois générique qui est utilisé pour plusieurs entités comme ici: asp.net mvc generic controller

EDIT: vous pouvez voir cette technique dans une application d'exemple mvc asp.net ici: http://prodinner.codeplex.com