Советы новичку о приложениях N-уровня
Хорошо, люди, вот еще один для тебя:
Я начинаю в мире приложений n-уровня. Я немного почитал эту тему, и общий совет заключается в том, что целью n-уровневых приложений является абстрагирование функциональности между слоями. Итак, исходя из этого, в n-уровневом приложении обычная модель:
Data Access -> Business Layer -> Presentation
Поскольку я являюсь разработчиком.NET, я подумал, что для улучшения интеграции с несколькими типами клиентов (Silverlight, веб-приложение или даже клиент WinForms) мне следует использовать WCF (Windows Communication Foundation) в качестве служб данных на бизнес-уровне, чтобы клиенты могли общаться к нему независимо от его типа. Кроме того, я большой поклонник NHibernate как ORM. Итак, моя структура выглядит так:
Data Access (NHibernate) -> Business Layer (WCF) -> Presentation (WPF, ASP.NET, WinForms
Итак, это настройка. Я совершенно новичок в такого рода подходах, поэтому я подумал, что могу написать здесь с просьбой дать совет по этой настройке. Кроме того, я очень озадачен тем, как настроить это в решении VS. Мне нравится разделять слои в разных проектах, но как насчет абстракции объектов данных (таких как Customer, Order и т. Д.)? Я помещаю их в отдельную библиотеку? А как насчет WCF? Я знаю, это грех программиста - передавать классы данных по проводам клиенту. Как профессионал может этого добиться?
Спасибо, любой совет будет очень признателен.
1 ответ
Это в значительной степени в цель. N-Tier, однако, немного сложнее, чем N-Layer, и его можно противопоставить, спросив: "Действительно ли ваши уровни живут на отдельных физических серверах?"
В зависимости от того, насколько сложен ваш бизнес-уровень, вы можете захотеть дополнительно разделить его между уровнями Business и Service. Обычно эти два связаны очень тесно и живут на одном физическом сервере. Сервисный уровень часто выступает в качестве фасада для вашего BLL.
Если ваш уровень Презентации находится на том же сервере, то приложения ASP.NET или WinForms могут захотеть обмениваться данными с BLL без прохождения служб WCF.
Читайте о Microsoft Patterns & Practices - Руководство по архитектуре приложений.
Ваши доменные объекты должны жить в собственной сборке, как правило, в вашей доменной модели. Согласно Руководству по проектированию Microsoft Framework, хорошей практикой будет называть сборки вашего проекта соответственно:
[О компании].[ProductOrComponent].[...]
Мне нравится этот формат пространства имен и обычно использую:
[О компании].[Product].[Layer].[Подуровень]. [...]
Вот пример решения с использованием папок решений для организации каждого проекта:
В этом примере у меня есть BLL и сервисный уровень. Уровень Service предоставляет фактическую реализацию в библиотеке WCF, в то время как презентация фактически содержит веб-приложение WCF для размещения служб. Всегда полезно отделять реализацию от интерфейса.
Папку /Client можно игнорировать, я просто использую ее в качестве примера консольного приложения для тестирования. Любые клиентские приложения, которые используют ваш сервис, вероятно, должны иметь свое собственное решение, или вы собираетесь управлять огромным решением.
Что касается вашего объекта данных, передаваемого по проводам... Я предполагаю, что вы имеете в виду классы из вашего ORM. (Модель предметной области) Вы правы, это обычно считается плохой практикой. Решение использует объекты передачи данных. Вы можете видеть на картинке, у меня есть библиотека.Dto. Если вы в состоянии использовать такие инструменты, как AutoMapper, то, тем не менее, я за него, но добавление DTO к вашему решению влечет за собой дальнейшую сложность и обслуживание. Я считаю, что Дино Эспозито написал хорошую статью на эту тему. Постараюсь найти это для вас.
Надеюсь это поможет.
[РЕДАКТИРОВАТЬ]
Должен заметить, я не знаком с возможностями nHibernate. Там могут быть лучшие решения для использования этого ORM. Я работал только с Entity Framework.
[РЕДАКТИРОВАТЬ 2]
Ознакомьтесь с Dino Esposito's - "за" и "против" объектов передачи данных