Разработка мультитенантного приложения с использованием SOA, UoW, репозитория, DataContext и нескольких баз данных - PullRequest
2 голосов
/ 01 декабря 2010

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

Я добавляю новые функции в существующее приложение, которое объединяет данные из нескольких баз данных.Короче говоря, это позволяет клиентам и / или их бухгалтерам получать доступ и обновлять финансовую информацию об их местонахождении.Приложение имеет 3 уровня с веб-клиентом (я надеюсь заменить его на клиент Silverlight очень скоро), сервисный уровень, работающий на сервере приложений, и уровень базы данных.

Когда я стал владельцем,Приложение, несмотря на наличие 3-х уровней, было очень упрощенным.Он использует ADO.NET для всего, и веб-служба является просто промежуточным звеном для динамических (строковых) SQL-запросов к одной из баз данных.Моей первой задачей было «очистить» существующий код.В приложении не было ничего объектно-ориентированного, и все было плоским.Я начал рефакторинг приложения, чтобы использовать LINQ-to-SQL, внедрил шаблон Repository, чтобы сделать бизнес-логику тестируемой (не говоря уже о том, что она становится более удобной в обслуживании, поскольку мы развиваем технологию доступа к данным от ADO.NET до L2S и, надеюсь, доEntity Framework) и переработал код для фактического использования функций .NET.

В большинстве случаев веб-приложение - это просто, поскольку каждая страница представляет собой простой запрос к таблице или представлению в базе данных.(через веб-сервис).На стороне сервера приложений я получил DataContext для каждой базы данных и репозиторий для каждой сущности (или Aggregate Root с использованием терминов DDD).Я использую инъекцию конструктора (Castle Windsor), чтобы установить правильный экземпляр репозитория для моего класса обслуживания, а также для DataContext, используемого репозиторием.

Это все хорошо, за исключением того, что теперь я должен добавить возможность редактирования вприложение, которое требует логики, охватывающей 4 базы данных, и я в недоумении для правильного подхода.Крайне важно, чтобы поток и архитектура приложения были согласованы и поддерживались разработчиками младших классов.(Помимо меня, команда - это в основном разработчики VB6, которые думают, что они программируют .NET, потому что они используют VS и BCL - они очень мало знают о шаблонах, методах, модульном тестировании, макетах и ​​т. Д., И т. Д. И т. Д.)*

Позвольте мне пройтись по тому, что необходимо для работы представления редактирования:

  1. Когда страница загружается впервые, я генерирую список «редактируемых» финансовых периодов.
    1. Этот список основан на наборе правил, содержащихся в базе данных SQL Server (назовите его «БД метаданных»).Каждая строка в таблице идентифицирует финансовый период по имени вместе с временным периодом, в который он может быть отредактирован.
    2. Эти правила используются для запроса таблицы в финансовой базе данных DB2, которая отображает имя периода и год в фактические даты,Этот запрос вернет все записи с датой окончания в прошлом и датой закрытия (дата окончания плюс длина редактирования сверху) после сегодняшнего дня.
  2. Страница будетпо умолчанию выбранный период на самый последний.Когда период выбран, я запускаю другой запрос, чтобы заполнить список местоположений, которые текущий пользователь может редактировать в течение выбранного периода.
    1. Сначала я должен запросить информацию о безопасности пользователя из базы данных «Безопасность» и определить, входят ли они в роль «Бухгалтеры».Если это так, то я должен запросить базу данных метаданных, чтобы получить список клиентов для текущего пользователя.Если нет, то я использую clientID текущего пользователя.
    2. Далее я запрашиваю финансовую базу данных DB2, чтобы получить список расположений, фильтрация на основе выбранного периода и список clientID, которыепользователь может получить доступ.Я также фильтрую по статусу, поэтому я возвращаю только те места, которые были активны в течение этого периода.
  3. Как и за период, страница по умолчанию выберет первое место в списке.Когда местоположение выбрано, я делаю еще один запрос на фактические финансовые данные для этого местоположения в течение выбранного периода.
    1. Этот запрос сделан в базу данных «Staging» и довольно прост.
  4. Все это повторяется, если пользователь выбираетдругой период или местоположение.

Итак, давайте возьмем # 2 и рассмотрим, как я должен реализовывать это в своем сервисном приложении, используя шаблоны единиц работы и репозитория и… О, одна проблема- LINQ-to-DB2 не существует, и компания пока не будет переходить на EF, поэтому мне остается использовать ADO.NET при работе с этой базой данных.Но не позволяйте этому удерживать вас, так как я хотел бы, чтобы решение было настолько технологически независимым, насколько это возможно, потому что они могли бы передумать в любой день.На самом деле, они могли бы сменить парадигмы и перейти на NHibernate, насколько мне известно на данный момент.Меня больше интересует переход от фасада службы к DataContext, а не столько о том, как реализован DataContext (или ObjectContext).

Можете ли вы рассказать мне о реализации вызова метода веб-службы с помощьюучетные данные текущего пользователя и выбранный финансовый период, выполняя шаги, описанные в # 2 выше, и возвращая соответствующий список местоположений?

Вот так ... Это было много, чтобы принять. Я ценю помощь, разбираясь с этим.*

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