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