Я пытаюсь выяснить лучший подход к архитектуре этого проекта.По сути, это профильный сайт группы.Я использую 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)?
Спасибо !!