Как использовать Entity Framework (4) скомпилированные запросы в N-уровневом многоуровневом приложении?
У меня есть проблема проектирования n-уровневого приложения с Entity Framework 4.
На стороне сервера, мое приложение имеет 3 слоя : - один уровень обслуживания (WCF) - один деловой слой - один слой обработки данных (работа с EF4)
Сущности-это POCO, место в независимом проекте / сборке.
Я использую инъекцию зависимостей для создания объектов бизнес-уровня и слоев DataAccess, поэтому я работаю только с интерфейсами, и у меня нет зависимости от EF в моем бизнесе слой.
Я хотел бы использовать скомпилированные запросы EF для улучшения производительности.
Но мои (бизнес) запросы определяются на бизнес-уровне, так как в моей архитектуре DataAccess предоставляет только методы CRUD.
Таким образом, скомпилированные запросы должны быть определены в бизнес-слое, но у меня нет зависимости от EF и я не хочу, чтобы он сохранял слабую связь, поэтому я не могу вызвать ObjectContext оттуда.
И определение запросов в DataAccess не соответствует моему дизайн приложения.
Итак, кто-нибудь знает, существует ли универсальный способ внедрения бизнес-запросов из бизнес-уровня в уровень DataAccess, чтобы я мог использовать их с Компилированными запросами ?
Я перепробовал много вещей и искал везде, и не мог найти ответа на этот вопрос ... : (похоже, EF не очень хорошо сочетается с такого рода N-уровневым приложением.
1 ответ:
Скомпилированный запрос относится к уровню доступа к данным, поскольку это специфическая функция доступа к данным, зависящая от классов доступа к данным. Если ваш дизайн не принимает этого, он просто не готов к конкретным функциям доступа к данным = либо измените свой дизайн, либо не используйте конкретные функции доступа к данным.
Самый простой способ-добавить компилированные запросы в контекст и представить их в виде методов в контексте:
public IQueryable<SomeEntity> SomeQuery(string someParam) { return compiledQuery.Invoke(this, someParam); }
Теперь вы добавите эти методы в интерфейс для контекст.
Вы можете следовать аналогичному подходу и предоставлять скомпилированный запрос на любом интерфейсе доступа к данным, видимом в бизнес-слое.