Я всегда разрабатывал код в типе SOA пути. В этом году я пытался сделать больше DDD, но я продолжаю получать чувство, что я не получаю его. На работе наши системы являются загрузкой, сбалансированной и разработанной, чтобы не иметь состояние. Архитектура:
Веб-сайт
=== Физический уровень ==
Основной сервис
== Физический уровень ==
Сервер 1/сервис 2/сервис 3/сервис 4
Только Сервер 1, Сервис 2, Сервис 3 и Сервис 4 может говорить с базой данных и Основными Служебными вызовами корректный сервис на основе заказанных продуктов. Каждый физический уровень является загрузкой, сбалансированной также.
Теперь, когда я разрабатываю новый сервис, я пытаюсь думать DDD в том сервисе даже при том, что действительно не такое чувство, что он соответствует.
Я использую хорошие принципы DDD как объекты, типы значения, репозитории, агрегируется, фабрики и и т.д.
Я даже попытался использовать ORM's, но они просто не кажутся, что помещаются в распределенную архитектуру. Я знаю, что существуют пути вокруг этого, например, используют IStatelessSession вместо ISession с NHibernate. Однако ORM просто чувствуют, что не помещаются в распределенную архитектуру.
Я заметил, что действительно только использую некоторые понятия и шаблоны, которые DDD преподавала мне, но полной архитектурой является все еще SOA.
Я начинаю думать, что DDD не помещается в большие системы, но я действительно думаю, некоторые шаблоны и понятия действительно помещаются в большие системы.
Как я сказал, возможно, я просто не схватываю DDD, или возможно я по анализу моих проектов? Возможно, при помощи шаблонов и понятий DDD учила меня, что я использую DDD? Не уверенный, если существует действительно вопрос этому сообщению, но большему количеству мыслей, я имел при попытке выяснить, где DDD помещается в полные системы и насколько масштабируемый это действительно. Истина, я не думаю, что действительно даже знаю, каков DDD?
Самыми важными в предметно-ориентированном дизайне являются общие идеи:
Они широко применимы и являются наиболее ценными.
Существует множество шаблонов проектирования о фабриках, службах, репозиториях, агрегатах и т. Д. Я воспринимаю это как совет от одного опытного разработчика к другому, а не как евангелие, потому что многое из этого может варьироваться в зависимости от язык и фреймворки, которые вы используете. Имхо они склонны переоцениваться, потому что программисты, подобные нам, ориентированы на детали, и мы зациклены на таких вещах. Там тоже есть ценные вещи, но их нужно рассматривать в перспективе. Так что некоторые из них могут быть не так важны для вас или могут расти на вас по мере того, как вы с ними работаете.
Я бы сказал, что это не контрольный список, который можно пройти, чтобы убедиться, что вы используете все шаблоны, а вопрос в том, чтобы держать в уме общую картину и видеть, как это меняет ваш подход к разработке программного обеспечения. И если вы почерпнете несколько хороших советов из шаблонов, это тоже здорово.
В частности, что касается SOA, я разработал приложения, которые передают все свое состояние базе данных, в которых используются объекты домена, игнорирующие персистентность. Написание тестов для сервисов, которые должны имитировать daos и предоставлять обратную связь, - это утомительное дело, чем больше логики я могу добавить в объекты домена, тем меньше мне придется возиться с макетами в моих сервисах, поэтому мне, как правило, больше нравится такой подход.
Я думаю, что распространенное заблуждение заключается в том, что SOA и DDD - это два конфликтующих стиля.
IMO, это две концепции, которые отлично работают вместе; Вы создаете модель домена, которая инкапсулирует ваши концепции домена, и открываете точки входа в эту модель через сервисы.
Я также не понимаю, в чем проблема с ORM и сервисами, вы можете легко использовать сессию/uow для вызова сервиса. Просто смоделируйте свои сервисные операции как атомарные команды домена.
наивный пример:
[WebMethod]
void RenameCustomer(int customerId,string newName)
{
using(var uow = UoW.Begin())
{
var customerRepo = new CustomerRepo(uow);
var customer = customerRepo.FindById(customerId);
customer.Rename(newName);
uow.Commit();
}
}
Возможно, проблема, с которой вы столкнулись, заключается в том, что вы создаете сервисы типа "UpdateOrder", которые принимают объект заказа и пытаются обновить его в новой сессии?
Я стараюсь избегать такого рода сервисов и вместо этого разбиваю их на более мелкие атомарные команды.
Каждая команда может быть представлена как операция, или вы можете иметь одну сервисную операцию, которая получает группы команд и затем делегирует их обработчикам команд.
IMO, таким образом вы сможете лучше раскрыть свои намерения.
В DDD представлены некоторые концепции, которые могут запутать вас при построении SOA.
Я должен полностью согласиться с другим ответом , что SOA-сервисы предоставляют операции, которые действуют как атомарные команды. Я считаю, что очень чистая SOA использует сообщения вместо сущностей. Реализация сервиса затем будет использовать модель предметной области для фактического выполнения операции.
Однако в DDD есть концепция, называемая «доменная служба». Это немного отличается от службы приложений. Обычно «служба домена» разрабатывается на том же широко распространенном языке, что и остальная часть модели предметной области, и представляет собой бизнес-логику, которая не полностью вписывается в сущность или значение.
Службу домена не следует путать со службой приложения. Фактически, служба приложения вполне может быть реализована так, что она будет использовать службу домена. В конце концов, сервисы приложений могут полностью инкапсулировать модель предметной области в SOA.