https://automapper.org/ https://nhibernate.info/ AutoMapper和IoC 通过NHibernate和AutoMapper将DTO的entityID转换

    使用NHibernate,AutoMapper和ASP.NET MVC的”最佳实践”

    1. class Entity
    2. {
    3. public int Id { get; set; }
    4. public string Label { get; set; }
    5. }
    6. class Model
    7. {
    8. public int Id { get; set; }
    9. public string Label { get; set; }
    10. }

    实体和模型的映射如下:

    1. // 配置自动映射器
    2. Mapper.CreateMap<Entity,Model>();
    3. Mapper.CreateMap<Model,Entity>()
    4. .ConstructUsing(m => m.Id == 0 ? new Entity() : Repository.Get(m.Id));

    控制器中:

    1. public ActionResult Update(Model mdl)
    2. {
    3. // IMappingEngine 已注入控制器,IMappingEngine注入到控制器中,而不是使用静态Mapper类
    4. // Entity ent = Mapper.Map<Model,Entity>(mdl); // 执行映射
    5. var entity = this.mappingEngine.Map<Model,Entity>(mdl);
    6. Repository.Save( entity );
    7. return View(mdl);
    8. }

    改善:

    1. public interface IBuilder<TEntity, TInput>
    2. {
    3. TInput BuildInput(TEntity entity);
    4. TEntity BuildEntity(TInput input);
    5. TInput RebuildInput(TInput input);
    6. }

    为每个实体或/和某些实体组实现此接口,您可以做一个通用的并在每个控制器中使用它;使用IoC;
    您将映射代码放在前两种方法中(与映射技术无关,您甚至可以手动完成)
    当您获得ModelState.IsValid == false时,则使用RebuildInput,只需再次调用BuildEntity和BuildInput。
    控制器中:

    1. public ActionResult Create()
    2. {
    3. return View(builder.BuildInput(new TEntity()));
    4. }
    5. [HttpPost]
    6. public ActionResult Create(TInput o)
    7. {
    8. if (!ModelState.IsValid)
    9. return View(builder.RebuildInput(o));
    10. repo.Insert(builder.BuilEntity(o));
    11. return RedirectToAction("index");
    12. }