NHibernate, AutoMapper и ASP.NET MVC

Мне интересно, как лучше всего использовать 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);
} 

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


person mathieu    schedule 21.08.2010    source источник
comment
хорошо, подумайте о своем проекте и обо всем, что вам нужно будет реализовать, и если этот подход создаст вам какие-либо проблемы   -  person Omu    schedule 23.08.2010


Ответы (2)


вот как я поступал в проекте:

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

person Omu    schedule 23.08.2010

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

Взгляните на эту ссылку создателя AutoMapper,

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

person Castrohenge    schedule 23.08.2010