3

編集:

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]

上記のテーブルの設定は、列が上記の列にマップされる DB テーブルに保存されます (明らかに最後の列は除きます)。

すべての (保存と削除) アクションは、ローカリゼーション コントローラーに直接送信されます。ローカリゼーション コントローラーは基本的に、次のように LocalizationService のメソッドを呼び出します。

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

その LocalizationService は、次のような LocaleMapperDb を呼び出します。

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

ただし、この設定を保存する責任は次のとおりです。

[x] let visitors browser-settings determine default language

これは、site_settings という DB テーブルに保存されます。私はいくつかのオプションを考えました:

  • LocalizationController で SiteService / SiteSettingsService を使用します。ただし、完全なフォームは既に LocalizationService で生成および処理されています。
  • LocalizationService で SiteMapperDb / SiteSettingsMapperDb を使用し、updateCollection( $_POST ) で使用します。
  • LocaleMapperDb で SiteMapperDb / SiteSettingsMapperDb を使用する

最初と最後のオプションは最悪のオプションのように見えますが、よくわかりません。最良の選択肢は何だと思いますか? それとも、私が思いもよらなかった別の選択肢がありますか?

4

1 に答える 1

2

この状況では、ドメイン モデル オブジェクトをビュー モデル オブジェクトに射影するとうまくいくと思います。

添付のコードの場合 (C# で書いていることをお許しください。かなり移植性があるはずです)、ドメイン モデル オブジェクトは公開されません (サービス オブジェクト内で直接アクセスされるだけです)。サービスはビュー モデル オブジェクトのみを公開します。のようLocalViewModelに、これらのビュー モデル オブジェクトはコントローラーによって操作されます。

またLocaleConfigController、サービスから返されたデータをオブジェクトにマップしますLocaleConfigViewModel。このオブジェクトは、ビューと直接交換される唯一のオブジェクトです。

つまり、簡単に言えば、ビューには専用のコントローラーがあり、ビューはオブジェクトを介してコントローラーと通信しLocaleConfigViewModelます。コントローラはLocaleConfigViewModelオブジェクトを操作し、ILocaleConfigServiceおよび の実装を呼び出しますISystemConfigService。サービス オブジェクトは、ドメイン モデルをコントローラーに公開することはなく、ビュー モデル オブジェクトをドメイン モデル オブジェクトにマッピングする役割を果たします (必要な永続化メカニズムを介して)。

ロケール サービスは構成サービスであることに注意してください。正しいローカライズされた文字列を検索するための実装はありません。ローカリゼーション構成の変更を許可するメソッドを公開したくない場所で使用できるため、それを別のサービスに入れます。

たとえば、アプリケーションの管理側では、ローカリゼーション構成サービスとローカリゼーション文字列レンダリング サービスの両方が必要になります (管理サイトもローカライズできるため)。顧客向けフロント エンドの場合は、代わりに、おそらくシステム構成の変更は望ましくなく、そのサイトの範囲外であるため、ローカリゼーション文字列レンダリング サービス。

LocaleConfigViewModel最後に質問に答えると、コントローラーにはロケールとシステム構成サービスの両方への参照が含まれており、コントローラーはビュー専用です。s のみが交換される明確なコントラクトがあります。

システム全体の設定を保存する責任がある場所については、コントローラが からシステム設定をアンパックし、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; }
  // ...
}
于 2011-01-28T07:21:36.457 に答える