Как передать объекты между слоями абстракции в c #? - PullRequest
4 голосов
/ 12 июля 2011

Итак, у меня есть приложение, структурированное со следующими слоями:

Application layout

На данный момент я не использую какие-либо концепции объектов для получения данных из самого нижнего слоя. Я просто использую DataTables для вывода данных. Я не доволен этим, потому что он требует, чтобы уровень бизнес-логики знал имена столбцов и т. Д.

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

Вот мой вопрос. Если бы я хотел, чтобы уровень абстракции данных принимал и отвечал объектами, как мне избежать обращения к DAL из уровня обслуживания? Я читал, что объектные фабрики - это один из способов, а также я читал, что могу создавать функции преобразования объектов и т. Д.

Каким образом вы успешно применили это? Моя конечная цель - предоставить подключаемые DAL для различных поставщиков серверов баз данных.

Ответы [ 4 ]

6 голосов
/ 12 июля 2011

Стандартный подход, который я часто использую, состоит в том, чтобы иметь общую библиотеку объектных моделей, представляющих мой домен: Customer, Order, OrderLine и т. Д., Которые являются общими для всех слоев.

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

После этого вы можете иметь подключаемый DAL, но ваш DAL по-прежнему должен соответствовать договору о возврате ICustomer.

Это не мешает ссылкам быть обязательными, необходима ссылка, по крайней мере, на интерфейсы - как прокомментировал кто-то другой, другие ссылки, для сильных типов или фабрик, могли бы тогда быть учтены - например, с IoC / DI frameworks.

На мой взгляд, модель commom - это сквозная проблема в дизайне вашего приложения, и ее не следует рассматривать как нарушение слоев.

Обновление: это очень расплывчатое объяснение решения, так что я стою на нем опираться.

Обновление 2: и теперь, конечно, чтобы ответить на ваш вопрос. Стандартный способ непосредственного удаления ссылки на DLL - это предоставление контракта через интерфейс, в вашем случае с помощью метода DAL GetCustomers ваш уровень обслуживания связывается с интерфейсом, но запрашивает экземпляр DAL через внедрение / инверсию зависимости. Каркас управления или, проще говоря, заводской. Я обычно иду заводским путем для небольших приложений, он включает в себя другую DLL. Сервисный уровень будет ссылаться на интерфейсы и фабрику, DAL будет ссылаться на интерфейс, фабрика будет ссылаться на интерфейс и DAL.

enter image description here

1 голос
/ 12 июля 2011

Определите простые объекты (или интерфейсы) в «общей» сборке и используйте их.

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

0 голосов
/ 12 июля 2011

Для простого приложения мне нравится ...

  • Использование ORM в моем DAL для упрощения доступа к данным ( Entity Framework )
  • Использованиешаблон репозитория для операций CRUD ( шаблон репозитория )
  • Использование шаблона репозитория в качестве абстракции DAL, сопоставление объекта ORM с DTO или объектами модели / домена ( DTO )

Также я ...

  • Использовать инфраструктуру внедрения зависимостей для репозиториев , это позволяет подключить любую базу данных (StructureMap )
  • Пишите модульные тесты и макетируйте мои репозитории ( NUnit )

Однако, если бы у меня был новый проект, я бы пошел код-сначала с EF4 вместо наличия слоя отображения ORM-DTO.( Code-First с EF4 )

Мир!

0 голосов
/ 12 июля 2011

Другой подход заключается в использовании простых старых объектов clr (POCO). Ваша абстракция данных и бизнес-уровень могут использовать это. В модели домена POCO обычно вы используете такой инструмент, как nhibernate, для управления персистентностью.

Вместо интерфейсов nhibernate представляет «прокси», который незаметно вводит поведение персистентности посредством декорирования (файл XML или атрибуты). С этим подходом вы можете стать весьма продуктивным, когда привыкнете к нему.

Кроме того, все три слоя могут использовать одни и те же простые объекты POCO, которые могут несколько упростить ситуацию.

re: различные сборки, либо помещают объекты в разделяемую сборку, либо (как это часто делают в MS) используют генерацию кода для генерации одной и той же "схемы" POCO в других слоях. Иногда промежуточная сборка просто недоступна для совместного использования ... или вы хотели бы внести изменения в дополнительные слои (возможно, из-за проблем безопасности). Таким образом, связь должна зависеть только от сериализации, но в то же время определить один раз (схема POCO) и представить схему различным уровням с помощью инструментов (часть генерации кода).

Надеюсь, это поможет.

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