Как использовать Entity Framework (4) скомпилированные запросы в N-уровневом многоуровневом приложении?


У меня есть проблема проектирования n-уровневого приложения с Entity Framework 4.

На стороне сервера, мое приложение имеет 3 слоя : - один уровень обслуживания (WCF) - один деловой слой - один слой обработки данных (работа с EF4)

Сущности-это POCO, место в независимом проекте / сборке.

Я использую инъекцию зависимостей для создания объектов бизнес-уровня и слоев DataAccess, поэтому я работаю только с интерфейсами, и у меня нет зависимости от EF в моем бизнесе слой.

Я хотел бы использовать скомпилированные запросы EF для улучшения производительности.

Но мои (бизнес) запросы определяются на бизнес-уровне, так как в моей архитектуре DataAccess предоставляет только методы CRUD.

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

И определение запросов в DataAccess не соответствует моему дизайн приложения.

Итак, кто-нибудь знает, существует ли универсальный способ внедрения бизнес-запросов из бизнес-уровня в уровень DataAccess, чтобы я мог использовать их с Компилированными запросами ?

Я перепробовал много вещей и искал везде, и не мог найти ответа на этот вопрос ... : (похоже, EF не очень хорошо сочетается с такого рода N-уровневым приложением.

1 2

1 ответ:

Скомпилированный запрос относится к уровню доступа к данным, поскольку это специфическая функция доступа к данным, зависящая от классов доступа к данным. Если ваш дизайн не принимает этого, он просто не готов к конкретным функциям доступа к данным = либо измените свой дизайн, либо не используйте конкретные функции доступа к данным.

Самый простой способ-добавить компилированные запросы в контекст и представить их в виде методов в контексте:

public IQueryable<SomeEntity> SomeQuery(string someParam) {
    return compiledQuery.Invoke(this, someParam);
}

Теперь вы добавите эти методы в интерфейс для контекст.

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