NHibernate, AutoMapper и ASP.NET MVC - PullRequest
       14

NHibernate, AutoMapper и ASP.NET MVC

4 голосов
/ 21 августа 2010

Я задаюсь вопросом о «наилучшей практике» использования 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 is injected into the controller
    var entity = this.mappingEngine.Map<Model,Entity>( mdl );

    Repository.Save( entity );

    return View(mdl);
} 

Это правильно или можно улучшить?

Ответы [ 2 ]

1 голос
/ 23 августа 2010

как я делал в проекте:

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

РЕДАКТИРОВАТЬ: вы можете увидеть эту технику в примере приложения asp.net mvc здесь: http://prodinner.codeplex.com

0 голосов
/ 23 августа 2010

Я бы вставил IMappingEngine в контроллер вместо использования статического класса Mapper. После этого вы получите все преимущества от возможности смоделировать это в своих тестах.

Посмотрите на эту ссылку создателя AutoMapper,

http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/11/automapper-and-ioc.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...