Разработка приложений .NET с несколькими базами данных по направлениям деятельности - PullRequest
2 голосов
/ 09 февраля 2010

Основные данные компании хранятся и управляются в физически отдельных сторонних бизнес-приложениях: финансы, управление транспортом. Клиенты создаются в приложении «Финансы» (SQL Server), информация о доставке хранится в приложении «Управление транспортом» (Oracle). Связь между ними является двухточечной.

Нам нужно создать новое приложение (хорошо обновить старое, но, по сути, с нуля), чтобы обрабатывать претензии клиентов по поводу поврежденных или коротких поставок. Заявки, данные о клиенте и доставке в настоящее время вручную вводятся в MS Access. Это будет перенесено в базу данных SQL-сервера. Платформа для разработки приложений VS2008 (C #).

Я бы хотел избежать хранения всех данных о клиентах и ​​доставке в базе данных заявок, поскольку мы уже храним их в другом месте, поэтому я планирую создавать каналы на основе WCF из систем LOB (и, возможно, базы данных заявок), которые затем могут быть использованы в качестве источников данных для приложения претензий клиента. Будет введен специфический для претензий ввод данных, но основные клиенты и данные о доставке не нужно будет обновлять в приложениях LOB.

Пока я имею в виду

база данных -> ORM -> WCF \
база данных -> ORM -> WCF ---> BLL -> UI
база данных -> ORM -> WCF /

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

Я на правильном пути или мне здесь не хватает общей картины - нужно ли просто запускать регулярные извлечения в db для утверждений и работать с традиционной n-уровневой / n-слойной архитектурой?

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

Я не думаю, что ваш дизайн слишком далеко от того, где он должен быть.

Если у вас есть приложения, которые будут получать доступ к финансовым данным через службу WCF или службу транспорта, их имеет смысл создать. Их также имеет смысл создавать, потому что каждый из этих сервисов просто поддерживает то, что ему нужно знать (связано с принципом единой ответственности).

Там, где вам может показаться неправильным, ваше приложение UI должно знать об этом и вызвать 3 отдельные службы, чтобы выполнить свою работу. В подобных ситуациях мы часто строим сервис-оболочку, который вызывает соответствующий сервис. Это означает, что ваше приложение пользовательского интерфейса будет ссылаться на службу WCF, а затем эта служба будет вызывать службу финансов, службу транспорта или службу утверждений. Недостаток - каждый вызов приводит к нескольким вызовам ... да. Но он абстрагирует логику от вашего пользовательского интерфейса и дает вам преимущество, позволяя вам манипулировать или комбинировать данные из других сервисов или добавлять другую бизнес-логику, подходящую для приложения. Вы также по-прежнему получаете выгоду от службы «Финансы», которая по-прежнему поддерживает финансовые приложения, не мешая бизнес-потребностям вашего пользовательского интерфейса или мешая работе кода.

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

РЕДАКТИРОВАТЬ (для ответа на дополнительный вопрос потребовалось слишком много места, чтобы оставить комментарий).

Если данных, которые вы можете получить из службы транспорта, достаточно для того, чтобы ответить на вопрос, заданный «getCustomerDelieveries», то нет, я бы не стал разбивать их на другую службу оболочки. Если вам нужно больше данных, то какие другие приложения также выиграют от этой услуги, предоставляющей больше информации о клиентах? Эти приложения полагаются только на транспортную службу? Это один из тех случаев, когда ответ должен «чувствовать» вас правильно, поскольку вы больше всего знаете о своих системах.

Возможно, вам нужно нарушить правило SRP, и ваша транспортная служба получит больше информации о клиенте из финансовой базы данных или службы. Или, если приложениям, которые полагаются на транспортную службу, обычно требуется больше данных о клиентах, можно подумать о расширении таблицы клиентов в базе данных транспорта.

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

Вы начали этот пост с обсуждения нового приложения с пользовательским интерфейсом, которое будет поддерживать часть требований в вашем бизнесе, и для него нужны как финансовые, так и транспортные данные (а также собственные данные). Это идеальный кандидат для вызова службы оболочки. Требуются данные из 3 отдельных и отдельных источников данных. Ваша транспортная служба имеет ограниченную информацию о клиентах, которая хорошо работает для некоторых приложений, но, возможно, не так хорошо для других. Если вы напишите обертку, которая на 100% отражает вашу транспортную службу и дополнительно предоставляет немного больше данных о клиентах, что вы получили? Больше данных для приложений, которые их используют, но и больше обслуживания для вас, когда вы добавляете функциональность в транспортную службу. Какое еще значение может предоставить эта оболочка?

В этом случае, мне кажется, что транспортная служба получает больше данных о клиентах от финансовой службы "чувствует" лучше. В вашей базе данных транспорта есть некоторые данные, но их недостаточно. Это похоже на то, что транспортная служба должна восполнить этот недостаток, заполнив необходимые данные.

0 голосов
/ 10 февраля 2010

Мне следует использовать сервис оркестрации с WWF (или другим инструментом оркестровки).

Мне нравится этот вид:

DAL, BLL, SIL -> WCf1 DAL, BLL, SIL -> WCF2

wcf1 и wcf2 объединены службой оркестровки над ними. Таким образом, службы остаются автономными и отделенными, и вы можете использовать их в других оркестровках.

0 голосов
/ 09 февраля 2010

При создании отчетов обычно допустимо предоставлять не самые последние данные, поэтому может быть хорошей идеей выделить отдельную БД в качестве источника для отчетов о запросах. Ваши основные базы данных будут получать обновления от пользовательского интерфейса (используя преимущества обнаружения транзакций и конфликтов), а затем реплицировать данные в базу данных отчетов.

Этот архитектурный шаблон называется CQS (разделение командных запросов), прочитайте эту замечательную статью Уди Дахана.

...