2011-01-06 3 views
9

Я использую многоуровневую архитектуру с Entity Framework. Вот что я придумал до сих пор (все проекты исключения пользовательского интерфейса библиотеки классов):Entity Framework в многоуровневой архитектуре

  • Сущность: РоКо Сущность. Полностью упорство невежественное. Нет Ссылка на другие проекты. Создано Microsoft ADO.Net POCO Entity Generator.

  • DAL: Файл EDMX (Entity Model) с классом контекста. (t4 сгенерировано). Список литературы: Entities

  • BLL: Business Logic Layer. Будет реализовывать шаблон репозитория на этом уровне. Ссылки: Entities, DAL. Это где ObjectContext получает заселена: var ctx=new DAL.MyDBEntities();

  • UI: Презентация слоя: веб-сайт ASP.NET. Ссылки: Entities, BLL + запись строки подключения к объектам в файле конфигурации (вопрос № 2).

Теперь мои три вопрос:

  1. Является ли мой слой discintion подход правильным?
  2. В моем UI, я получить доступ к BLL следующим образом:
    var customerRep = new BLL.CustomerRepository();
    var Customer = customerRep.GetByID(myCustomerID);

    Проблема заключается в том, что я должен определить строку сущности соединения в моем web.config/UI в app.config иначе я получаю исключение во время выполнения. IS, определяющий сущность строки соединения в пользовательском интерфейсе, портит различие уровней? Или это доступно в многоуровневой архитектуре.

  3. Должны ли я предпринимать какие-либо дополнительные шаги для отслеживания движения, ленивой загрузки и т. Д. (По и т. Д. Я имею в виду функции, которые Entity Framework охватывает в обычном, 1 проекте, без кода кода POCO)?

Спасибо и приносим извинения за длительный вопрос.

+1

каждый из «слоев» на отдельных уровнях/машинах? помните уровень уровня! =. – RPM1984

+0

Нет, многоуровневый, не многоуровневый – Kamyar

+0

Любые руководства по вопросу № 3? – Kamyar

ответ

12

BLL: бизнес-логика. Будет ли реализовывать шаблон хранилища на этом уровне

Я действительно не согласен с этим. Репозиторий предназначен для абстрагирования базового хранилища данных (sql-сервер, xml и т. Д.). Это проблема, связанная с уровнем данных, а не деловая - поэтому почему она должна быть в BLL?

Правильно ли установлен мой слой?

Вид. :) Это немного субъективно, но в целом у вас есть:

  • данные
    • Repository идет здесь.
  • Бизнес
    • Бизнес-правила, логики домена, и юридические лица.
  • Презентация
    • UI/веб-приложений.

Теперь, как правило, те три дробятся дальше. Так что в вашем случае я бы:

  1. MyCompany.MyProject.Data (Repository)
  2. MyCompany.MyProject.Business.Services (репозиторий вызове, применяет бизнес-правила, и т.д.)
  3. MyCompany.MyProject.Business .DomainModel (Сущности)
  4. MyCompany.MyProject.UI (веб-приложение)

Должен ли я принимать какие-либо дополнительные шаги для выполнения Chage отслеживания, отложенной загрузки, и т.д. (на и т.д. я м ean функции, которые Entity Framework охватывает в обычном, 1 проекте, не генерировании кода POCO)?

Если вы не используете POCO (например, используете генерацию кода по умолчанию). Тогда вам не нужно беспокоиться об отслеживании изменений.

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

Вместо этого заставьте код вызова (например, бизнес/услугу) на загружать, что ему нужно.

Если вы используете приложение ASP.NET MVC, если у вас есть ленивая загрузка, ваш вид может в конечном итоге вызвать базу данных во время рендеринга, разрушая шаблон MVC.

+0

Спасибо за внимание, что репозитории должны быть в DAL. Имеет смысл внедрить шаблон DDD. Но если я хочу реализовать бизнес-логику в репозиториях, имеет ли смысл иметь повторений в BLL? Вы предлагаете это вообще? Или я должен выполнять только основные операции CRUD в репозиториях? – Kamyar

+3

Нет. В репозитории/DAL не должно быть бизнеса. Если вы хотите применить бизнес-логику к запросам, у вас есть несколько вариантов. 1) Сделайте ваши методы репозитория специфичными для бизнеса: например, «Список GetOrdersForACustomer (int customerId)». Или 2) IQueryable репозиторий. Более сложно/рискованно. например, 'IQueryable FindOrders()'. Затем BLL вызывает этот метод и выполняет бизнес-логику (отложенный exec). На данный момент я придерживаюсь Варианта 1. – RPM1984

+1

Очень информативный. Спасибо. Благодаря этому вы теперь лучше понимаете разницу между шаблонами/слоями репозитория. – Kamyar

1

1) Слои кажется, хорошо для меня

2) не видят проблемы с строки соединения находятся в вашем UI app.config. Должно быть определено где-то. Вы можете скопировать DAL.config в папку BIN вашего приложения, в которой, вероятно, была создана строка соединения, когда вы создали проект, но для меня это казалось бы неправильным. Я бы лично управлять его в слое UI app.config

+0

Любой принимает Q # 3? – Kamyar

1

Проблема заключается в том, что я должен определить строку соединения сущностей в моем web.config/UI в app.config иначе я получить исключение во время выполнения.

Строка подключения всегда выбирается из app.config/web.config исполняемого appDomain (здесь ваше приложение asp.net, а не DAL). Так ват вы можете сделать, это создать файл XML для хранения настроек в вашем DAL проекте и читать эти настройки с помощью XML classses предоставляемого Dot Net рамок