Советы по настройке ASP.NET MVC, уровня EF и Automapper для проекта - PullRequest
1 голос
/ 17 января 2011

Я пытаюсь выяснить лучший подход к архитектуре этого проекта.По сути, это профильный сайт группы.Я использую ASP.NET 4, EF и Automapper (Structuremap тоже, но это не важно).Я сталкиваюсь с проблемами производительности и нуждаюсь в совете относительно того, является ли мой подход правильным или нет (я предполагаю, что нет).Я сосредоточусь на конкретных разделах и приведу примеры.

У меня есть класс репозитория EntityFramework, который взаимодействует непосредственно с объектами EF с помощью LINQ:

[Pluggable("Repository")]
public class EntityDataRepository : IRepository
{
    static EntityDataRepository()
    {
        // other mappings removed
        // Data. objects are EF objects, mapping to my DTO classes
        Mapper.CreateMap<Data.Event, Models.EventModel>();
        Mapper.CreateMap<Data.Genre, Models.GenreModel>();
        Mapper.CreateMap<Data.Band, Models.BandModel>();
    }

    public IEnumerable<BandModel> GetBandsByUser(Guid userId)
    {
        using (var ctx = new DbContext())
        {
            var user = GetCurrentUserModel(ctx, userId);

            var efBands = from r in user.BandRelations
                            orderby r.Date
                            select r.Band;

            return Mapper.Map<IEnumerable<Data.Band>, IEnumerable<Models.BandModel>>(efBands);
        }
    }
}

Полосы имеют жанры и события.Обратите внимание, что он отображает объекты EF на мой объект DTO и возвращает их список.Он действует как прокси, чтобы мои контроллеры могли вызывать методы для получения данных, которые ему нужны (реальная логика изменена, чтобы показать, что мне нужно):

namespace OpenGrooves.Web.Areas.Edit.Controllers
{
    [Authorize]
    public class MyBandsController : BaseController
    {
        public ActionResult ShowBands()
        {
            IEnumerable<BandModel> bands = repository.GetBandsByUser(loggedUserGuid).First();

            return View(bands);
        }
    }
}

Наконец, вот класс BandModel, который отражаетсущность класса Band в EF:

public class BandModel
{
    // fluff and scalar properties removed
    public IEnumerable<EventModel> Events { get; set; }
    public IEnumerable<GenreModel> Genres { get; set; }
}

По сути, я делаю это правильно?В моих классах EF to DTO сущность Band EF имеет навигационные свойства, такие как Жанры и События.Проблема в том, что во время отображения, которое происходит в automapper, эти свойства списка заполняются, особенно если один из моих прокси-методов возвращает список BandModels.Кажется, что он вызывает запросы Genres и Event EF для каждой записи, что, очевидно, является основным фактором снижения производительности (для каждого возвращаемого объекта BandModel выполняется как минимум 2 запроса для Events и Genres).

  • Можно ли использовать объекты EF непосредственно в моих контроллерах, возможно, даже использовать в качестве моделей для представлений?
  • Что-то нужно изменить в моих сопоставлениях, чтобы включить отложенную загрузкуза эти навигационные свойства (события, жанры вне объекта BandModel)?

Спасибо !!

1 Ответ

2 голосов
/ 17 января 2011

Можно ли использовать объекты EF непосредственно в моих контроллерах, возможно, даже использовать их в качестве моделей для представлений?

Да, Кинда.

Этот ответ субъективени зависит от того, как вы относитесь к разделению интересов.Большинство разработчиков MVC, в том числе и я, ругаются на просмотр моделей.Он отделяет ваши данные или классы предметной области от уровня представления.Это круто.

Некоторым людям не нравится быть крутыми, включая другие языки и фреймворки, такие как каждый PHP MVC, Rails и Django.Никто не может сказать, что эти языки «делают это неправильно», но разработчики .NET подписываются на другую парадигму.


Ваш второй вопрос странен, вы говорите: «Есть ли что-то, чтобы включить отложенную загрузку» сразу после того, как вы скажетеленивая загрузка происходит.Хотите объяснить?

Ленивая загрузка по умолчанию включена в EF4.

...