https://automapper.org/ https://nhibernate.info/ AutoMapper和IoC 通过NHibernate和AutoMapper将DTO的entityID转换
使用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));
控制器中:
public ActionResult Update(Model mdl){// IMappingEngine 已注入控制器,IMappingEngine注入到控制器中,而不是使用静态Mapper类// Entity ent = Mapper.Map<Model,Entity>(mdl); // 执行映射var entity = this.mappingEngine.Map<Model,Entity>(mdl);Repository.Save( entity );return View(mdl);}
改善:
public interface IBuilder<TEntity, TInput>{TInput BuildInput(TEntity entity);TEntity BuildEntity(TInput input);TInput RebuildInput(TInput input);}
为每个实体或/和某些实体组实现此接口,您可以做一个通用的并在每个控制器中使用它;使用IoC;
您将映射代码放在前两种方法中(与映射技术无关,您甚至可以手动完成)
当您获得ModelState.IsValid == false时,则使用RebuildInput,只需再次调用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");}
