Шаблон репозитория и доступ к данным - PullRequest
0 голосов
/ 22 сентября 2010

Я пытаюсь войти в проект с ASP.NET MVC и NHibernate (Newbie) и ищу более быстрый доступ к данным из DAL.

мое решение будет примерно asp.net mvc ------ Бизнес-уровень - Уровень DataAccess ---------- Все поддерживается уровнем инфраструктуры ----------------

Мой проект связан с объявлениями и сайтом сообщества, где необходим более быстрый доступ к данным.

Мне очень нравится реализация KIGG, но я не очень уверен, подходит ли шаблон репозитория для более быстрого доступа к данным.

Я посмотрел на S # arp Architecture, и он слишком большой для меня.

В репозиториях я тоже планирую отклониться от реализации KIGG и использовать следующее для извлечения объектов

IRepository {

void Add (); void Удалить ();

публичный IQueryable FindAll (Func exp) { return GetTable.Where (exp) .AsQueryable (); }

}

, где ежедневное посещение сайта может составлять около 10000–15000, рекомендуется ли использовать шаблон хранилища с указанным выше «Найти все»?

После прочтения за последние несколько дней схемы репозитория, а также того факта, что мнения самих экспертов различаются, я все больше путаюсь в том, как можно эффективно использовать репозитории (http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx)

Я знаю, что вопрос расплывчат, но любой совет приветствуется.

EDIT * 1

Мне нравится этот пункт о DAL: Попытка заключить в капсулу, чтобы было легче работать, отлично. Пытаетесь инкапсулировать, чтобы вы могли переключать OR / Ms? Не сработает, будет дорого и больно.

EDIT * 2

Я склоняюсь к шаблону "CQRS". Это кажется логичным, и из того, что я читал, чтение будет быстрее, даже если оно устарело. Чтение из домена в терминах объекта домена приведет к ненужной обработке для заполнения AggregateRoot и последующего преобразования их в ViewModels.

Спасибо, Мар

1 Ответ

1 голос
/ 23 сентября 2010

Для nHibernate просто верните IQuerable, который nHibernate LINQ создает для вас после применения выражения, если это необходимо.

То, что вы НЕ хотите делать, - это чтобы nHibernate конвертировал все как в список или некоторые другие объекты, а затем использовал AsQueryable для него. Просто:

return Session.Linq<T>.Where(Exp);

Возможно, это не то, о чем вы изначально думали, но, делая это, вы позволяете мощности LINQ работать, а то, что вы делаете с IQueryable, копировать через всю базу данных. Например, если вызывающий метод просто хотел агрегат, агрегат может происходить на сервере БД и быть гораздо более эффективным, чем извлекать все записи и затем выполнять агрегат локально.

Помните - с помощью IQueryable вы просто создаете дерево выражений, пока не доберетесь до точки, где дерево действительно должно быть оправдано. Когда это происходит, с провайдером DB LINQ, таким как LINQ to nHibernate, все в вашем дереве выражений анализируется и формируется запрос для базы данных. Вы получаете повышение производительности, потому что из БД выводится только то, что вам нужно - не более или менее.

Поскольку это происходит в БД, описанный вами шаблон должен работать просто отлично. Вы не будете получать все сущности каждый раз, только те, о которых просили.

Как всегда, это может не соответствовать вашей ситуации.

...