2013-05-21 2 views
1

Я создаю сайт, который должен немного измениться на определенных рынках. Например, на британском рынке форма регистрации должна выполнять проверку адреса (уже есть эта работа), а на сайте в Бельгии нам нужно проверить человека с веб-службой (уже есть эта работа). В противном случае функции регистрации в основном одинаковы. У нас эти два сайта работают независимо, но мы хотели бы объединить их в одну кодовую базу, которая может поддерживать любую опцию на основе config.Архитектура сайта - контроль/загрузка объектов на основе конфигурации?

Моя первоначальная мысль заключалась в том, чтобы использовать значение конфигурации, чтобы сказать «Это сайт в Великобритании» или «Это сайт в Бельгии» и отобразить страницы на основе этой настройки.

Идеи:

  • Dependency Injection для загрузки элементов управления динамически на основе конфигурации
  • Factory шаблон для использования Reflection/Активатор и загрузки динамически на основе конфигурации
  • Config трансформирует для загрузки различных пользовательских элементов управления, установив tagname/tagprefix
  • Другое?

У кого-нибудь есть какие-то первые мысли о рекомендациях о том, где я могу найти вдохновение для такого типа дизайна?

ответ

1

Я бы порекомендовал сохранить его максимально простым и минимальным.

Просто создайте что-то вроде IPersonValidator, которое имеет метод .Validate(PersonDetails) и возвращает массив ошибок.

Edit:

На стороне конфигурации, вы можете создать раздел пользовательской конфигурации следующей структуры:

<DomainSpecificSettings> 
<Key name="validator"> 
    <Value domain="www.yoursite.co.uk" value="firstValidator" /> 
    <Value domain="www.yoursite.de" value="secondsValidator" /> 
</Key> 
</DomainSpecificSettings> 

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

ValidatorsStore.GetValidator(string configValue).Validate(PersonDetails). 

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

+0

Спасибо за ответ! Это имеет смысл для меня. Всего несколько вопросов: - Для каждого «рынка» обязательно потребуется новое развертывание. Моя мысль с помещением в Config заключается в том, что, когда он настроен на развертывание, он никогда не изменится. Этот сайт остается такой конкретной реализацией (Великобритания, Бельгия или другой) - Для configValue вы видите преимущество в том, что URL-адрес является значением? Например, "sitename.co.uk" против "sitename.be"? Это субъективно, но просто ищет мысли. :) – trnelson

+1

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

+0

Это определенно полезно. И да, одна и та же кодовая база с точным развертыванием во все производственные среды, но флаг конфигурации, чтобы обозначить, какую версию сайта использовать (также открыта для предложений по этому поводу, но, похоже, это предпочтительный подход для всех остальных здесь.) Я ' м, немного знакомый с шаблоном Стратегии, но не свойственный этому примеру. Мне придется рассмотреть немного больше. На самом деле просто пытаюсь понять, с чего начать. – trnelson

1

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

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

О классе StrategyProvider, чтобы решить, какую логику позвонить, согласиться с Uri, у нас будет много мест, где логика варьируется между странами. Но это не что-то, что мы могли бы установить с контейнером IoC? Не знаю много о контейнерах IoC, но если логика «статична» (когда вы находитесь на веб-сайте, она не изменяется в зависимости от запроса), можно было бы установить ее во время запуска приложения.

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

+0

Очень хорошая информация. Согласился, что логика определения местоположения может быть отсортирована довольно немного в реальном пользовательском элементе управления. То, что я не слишком уверен (пока), - это определить, какой пользовательский элемент управления нужно загрузить. Технически, так как это будет в Umbraco, определение * можно было бы сделать там, но в идеале от конфигурации, чтобы удалить зависимость от CMS. Я думаю, что общая идея управления пользователями, которую вы упомянули, решает эту проблему. Так много думать! :) – trnelson

+0

Пользовательский элемент управления должен быть вставлен на Masterpage. Скорее всего, что не главная страница будет отличаться для разных стран. В этом случае вы можете вставить другой пользовательский элемент управления или задать параметр для определения режима просмотра. Если главная страница - это то же самое, но пользовательский элемент управления (например, адрес) различен, должна быть какая-то логика, может быть, на главной странице, которая решает (в зависимости от Url, config ...), которые управляют динамической загрузкой (шаблон стратегии LoadControl ("~/xxxxControl .ascx ")) или подает режим просмотра параметров. – Riga

+0

Возможно, первое осложнение состоит в том, чтобы попытаться использовать шаблон инъекции зависимостей в формах ASP.NET, но возможно, как описано [здесь] (http://www.gitshah.com/2011/10/enabling-dependency-injection-in-web .html) или [здесь] (http://ayende.com/blog/2756/rhino-igloo-mvc-framework-for-web-forms). Это должно быть проще, если использовать Umbraco 6 с MVC, поскольку это является одной из причин существования MVC. [Пример MVC] (http://docs.castleproject.org/Windsor.Windsor-tutorial-ASP-NET-MVC-3-application-To-be-Seen.ashx) – Riga

Смежные вопросы