2013-06-25 7 views
1

Я работаю над проектом ASP.NET MVC. В моем решении у меня есть следующие проекты: BlogApp.Web (ASP.NET MVC приложение), BlogApp.Data (библиотека классов)ASP.NET MVC Data Access Layer

Я задаюсь вопросом, как реализовать слой доступа к данным. Я хочу использовать подход EntityFramework Code First. Я думал о шаблоне репозитория, но это действительно необходимо? Я прочитал, что это только следующий слой поверх ORM, который на самом деле не нужен. Таким образом, вместо написания метода типа:

GetAllPosts(Tag t) { 
    db.Posts.Where(p => p.Tags.Contains(t)).Skip(x).Take(y).Select(p => p); 
} 

Я создаю контекст db в контроллере и пишу тот же запрос? Мне не нужно внедрять подкачки и писать обертки вокруг моих моделей.

+0

См. Принцип DRY: не повторяйте себя. В краткосрочной перспективе это может занять больше времени (не так долго по сравнению со многими копиями и вставками), но в долгосрочной перспективе это сэкономит вам много времени на обслуживание и тестирование, поэтому отладка - что мы все знаем, может занять намного больше времени, чем написав код в первую очередь. – TODOName

ответ

0

Не уверен, принадлежит ли этот вопрос здесь.

В любом случае, если вы пишете логику доступа к данным в своем контроллере, и в другом контроллере требуется такая же логика, что бы вы сделали? Скопировать-Вставить это в новый контроллер? Это просто не хорошо. В любое время, когда вы копируете и вставляете, вам нужно отступить, должно быть что-то не так (ака-код).

Разделение логики на другой уровень сделает ваш код более удобным и проверенным. Доверьтесь мне!

1

Что вы, возможно, слышали о шаблоне репозитория, так это то, что оно выпадает из-под посторонних в некоторых лагерях - см., Например, Jimmy Bogard's blog. Это не означает, что запросы должны быть написаны непосредственно в контроллерах, если ваше приложение не очень простое.

Как уже отмечалось, ваши запросы должны быть записаны только в одном месте, которое может использовать ваш контроллер - это будет либо в методе репозитория, либо в выделенном объекте запроса, оба из которых обеспечивают лучшую абстракцию и избегают дублирования.

Что касается упрощения - ваше приложение предназначено для нескольких интерфейсных плат, для чего потребуется отдельный сбор для вашего уровня доступа к данным? Если нет, вы можете подумать о слиянии двух сборок и просто использовать пространства имен, чтобы все было организовано.