Определите ответственность за сохранение настроек (контроллер, услуги и картины)

StackOverflow https://stackoverflow.com/questions/4718385

Вопрос

РЕДАКТИРОВАТЬ:

Потому что я озвучивал, что наградил первоначальную щедрость 300 @Arcain я открываю. И награждение дополнительного 150 @arcain. Если, конечно, кто -то не дает даже лучшего ответа. :)

/ РЕДАКТИРОВАТЬ

Рассмотрим следующую форму:

language | region | active | default |
-----------------------------------------------
en       | GB     | [x]    | (*)     | [X delete]
nl       | NL     | [x]    | ( )     | [X delete]
nl       | BE     | [x]    | ( )     | [X delete]

[x] let visitors browser-settings determine the default language

[save]

Настройки приведенной выше таблицы будут сохранены в таблице БД, которую столбцы отображают по приведенным выше столбцам (очевидно, исключая последний столбец).

Все (сохранение и удаление) Действия напрямую на локализацию контроллера. Контроллер локализации в основном вызывает методы на локализации, например, так:

$localizationService->updateCollection( $_POST ) // update collection settings
// or
$localizationService->delete( $_POST ) // delete a single locale

LocalizationService в его повороте вызывает локальный размер, что -то вроде этого:

foreach( $localeCollection as $locale )
{
    $localeMapperDb->update( LocaleModel $locale );
}
// or
$localeMapperDb->delete( LocaleModel $locale );

Где, однако, ответственность за сохранение этой настройки:

[x] let visitors browser-settings determine default language

Он будет сохранен в таблице БД под названием site_settings. Я подумал о нескольких вариантах:

  • Используйте SiteService / SiteSettingSservice в локализации. Но тогда полная форма уже генерируется и обрабатывается в локализации.
  • Используйте SiteMapperDB / SiteSettingSmapperdb в локализации и используйте его в UpdateCollection ($ _post)
  • Используйте SiteMapperDB / SiteSettingSmapperdb в localemapperdb

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

Это было полезно?

Решение

Я думаю, что проектирование объектов модели домена на представление объектов модели хорошо работает в этой ситуации.

В случае прилагаемого кода (пожалуйста, простите меня за написание его в C#; он должен быть довольно портативным) объекты доменной модели никогда не подвергаются разоблачению (к ним доступна только непосредственно в объектах службы.) Услуги только обнаруживают объекты модели представления, как LocalViewModel, и этими объектами представления модели манипулируются контроллерами.

А LocaleConfigController также отображает данные, возвращаемые службами в LocaleConfigViewModel Объект, и этот объект является единственным объектом, который обменивается непосредственно с представлением.

Итак, в двух словах, представление имеет выделенный контроллер, и представление связывается с контроллером через LocaleConfigViewModel объект. Контроллер манипулирует LocaleConfigViewModel объект и вызовы в реализации ILocaleConfigService и ISystemConfigService. Анкет Объекты службы никогда не подвергают модель домена контроллеру, и они отвечают за отображение объектов модели представления с объектами модели домена (через любой механизм постоянства желателен.)

Обратите внимание, что служба локализации является конфигурация Сервис, у него не будет никакой реализации, чтобы посмотреть, какими будут правильные локализованные строки. Я бы поместил это в другую службу, потому что его можно использовать в местах, где вы не хотели бы разоблачать какие -либо методы, которые позволят изменять конфигурацию локализации.

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

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

Что касается того, где несет ответственность за сохранение общесистемных настроек, контроллер отвечает за распаковку настройки системы из LocaleConfigViewModel и подтолкнуть их к соответствующим услугам (в этом случае ISystemConfigService экземпляр), где они будут сохраняться.

class LocaleViewModel
{
  public int Id;
  public string Language;
  public string Region;
  public bool Enabled;
  public bool Deleted;
}

class LocaleConfigViewModel
{
  public bool UseVisitorBrowserLocale;
  public LocaleViewModel DefaultLocale;
  public List<LocaleViewModel> Locales; 
}

class LocaleConfigController : ILocaleConfigController
{
  ILocaleConfigService localeConfig;
  ISystemConfigService systemConfig;

  public void Save(LocaleConfigViewModel model)
  {
    foreach (var locale in model.Locales)
    {
      if (locale.Deleted)
      {
        localeConfig.DeleteLocale(locale);
        continue;
      }
      localeConfig.UpdateLocale(locale);
    }
    systemConfig.DefaultLocaleId = model.DefaultLocale.Id;
    systemConfig.UseVisitorBrowserLocale = model.UseVisitorBrowserLocale;
  }

  public LocaleConfigViewModel GetCurrentView()
  {
    var model = new LocaleConfigViewModel();
    model.Locales = localeConfig.Locales;
    model.DefaultLocale = model.Locales.FirstOrDefault(l => l.Id == systemConfig.DefaultLocaleId);
    model.UseVisitorBrowserLocale = systemConfig.UseVisitorBrowserLocale;
    return model;
  }

  // ...
}

interface ILocaleConfigController
{
  void Save(LocaleConfigViewModel model);
  LocaleConfigViewModel GetCurrentView();
  // ... 
}

interface ILocaleConfigService // services will be stateless and threadsafe
{
  void DeleteLocale(LocaleViewModel locale);
  void UpdateLocale(LocaleViewModel locale);
  List<LocaleViewModel> Locales { get; }
  // ...
}

interface ISystemConfigService // services will be stateless and threadsafe
{
  int DefaultLocaleId { get; set; }
  bool UseVisitorBrowserLocale { get; set; }
  // ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top