UnitOfWork и разделение проблем? - PullRequest
0 голосов
/ 03 марта 2011

Я использую UnitOfWork / Сервисный уровень / Репозиторий / EF4 с дизайном POCO в моем приложении MVC.

Пока у меня есть это:

1) MVC Web App (Project.dll)
2) Сервисный уровень (Project.Data.Services.dll)
3) Уровень репозитория (Project.Data.Repositories.dll)
4) POCOS (Project.Data.Domain.dll)
5) EF4 / Context Layer (Project.Data.dll)

Каждый слой ссылается только на слой ниже и Project.Data.Domain (классы POCO).

У меня в настоящее время есть интерфейс / база UnitOfWork в Project.Data.dll, но теперь все слои должны ссылаться на это. Это плохой дизайн? И если да, то где он живет?

Ответы [ 4 ]

2 голосов
/ 03 марта 2011

Это просто мнение.

Доменные объекты являются частью бизнеса.То же самое для контекстов и хранилищ.

На самом деле, я хочу сказать, что OR / M - это абстракция над реляционной базой данных или другими типами хранилищ, поэтому они могут выступать в качестве объектно-ориентированного хранилища.

Это OR / M отбрасывает уровни данных в современных программных решениях.

Репозитории, контекст домена, объекты домена являются частью бизнес-уровня.

Единица работы - это программное обеспечениешаблон проектирования, и он предназначен не только для работы с базами данных или уровнем данных, но и может управлять многими вещами, такими как сетевые транзакции.Я бы посоветовал включить его в какое-то пространство имен, например "YourCompany.YourProject.Patterns.UnitOfWork" или что-то в этом роде.

Служба не имеет ничего общего с данными.Я хотел бы предложить пространство имен «YourCompany.YourProject.Services».

Еще один момент - ваши POCO, похоже, тоже работают как DTO, потому что вы используете везде, даже для передачи данных через слои и / илиярусы.Это может быть хорошо в реализации голых объектов или чего-то в этом роде, но вам нужно обратить внимание на факт использования объектов домена в качестве DTO, потому что они могут содержать свойства, информацию, поведение или OR / M прокси скрытых членов, которые могутвлияет на вес объектов - использование памяти -.

Принимая во внимание последний абзац, я бы посоветовал вам работать с DTO на любом уровне бизнеса, чтобы ваши службы возвращали DTO с определенным диапазоном свойств, которыеПотребители услуг должны будут нормально работать.

DTO, реализации шаблонов и подобные вещи, используемые во всех проектах, часть вашего решения должна находиться в каком-то проекте под названием «YourProject.Shared», и эта сборка не должна ссылаться налюбой слой: он должен оставаться нейтральным по отношению к слою, поэтому ссылка на него везде не обязывает иметь бесполезные зависимости.

Ну, это мое мнение и способ работы в моих проектах.

2 голосов
/ 03 марта 2011

Я думаю, лучше, если вы используете Dependency Injection.Вы можете взглянуть на этот великий пост: http://blog.keithpatton.com/2009/05/30/Entity+Framework+POCO+Repository+Using+Visual+Studio+2010+Net+40+Beta+1.aspx

1 голос
/ 04 марта 2011

Взгляните на https://github.com/sharparchitecture/Sharp-Architecture, у него есть пример Northwind, который похож на ваш. Вы увидите реализацию UnitOfWork.

1 голос
/ 03 марта 2011

Если вы не хотите, чтобы другие слои ссылались на проект данных, вы должны разделить IUnitOfWork, чтобы отделить проект и использовать внедрение зависимостей с некоторым контейнером инверсии.

...