設定を保存する責任(コントローラー、サービス、マッパー)を決定する
質問
編集:
私は最初の賞金を授与することに遅れていたからです 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->updateCollection( $_POST ) // update collection settings
// or
$localizationService->delete( $_POST ) // delete a single locale
ターンのローカライズサービスは、このような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でSiteMapperDB / SiteSettingSmapperDBを使用し、UpdateCollection($ _Post)で使用します
- localemapperdbでsitemapperdb / setesettingsmapperdbを使用します
最初と最後のオプションは最悪のオプションのように見えますが、私は確信が持てません。最良の選択肢は何だと思いますか?それとも、別の選択肢があるかもしれませんが、私は考えていませんか?
解決
この状況では、モデルオブジェクトを表示するドメインモデルオブジェクトをビューモデルオブジェクトに投影すると思います。
添付のコードの場合(C#で書くために私を許してください;かなりポータブルである必要があります)、ドメインモデルオブジェクトは決して公開されません(サービスオブジェクト内で直接アクセスされるだけです。)サービスはビューモデルオブジェクトのみを公開します。お気に入り LocalViewModel
, 、およびそれらの表示モデルオブジェクトは、コントローラーによって操作されます。
LocaleConfigController
また、サービスによって返されたデータをマップします LocaleConfigViewModel
オブジェクト、そしてこのオブジェクトは、ビューと直接交換される唯一のオブジェクトです。
したがって、一言で言えば、ビューには専用のコントローラーがあり、ビューはコントローラーと通信します。 LocaleConfigViewModel
物体。コントローラーが操作します LocaleConfigViewModel
オブジェクトとの呼び出し ILocaleConfigService
そしてその ISystemConfigService
. 。サービスオブジェクトはドメインモデルをコントローラーに公開することはなく、ビューモデルオブジェクトをドメインモデルオブジェクトにマッピングする責任があります(どんな永続メカニズムが望ましいものもありません。)
ロケールサービスはaです 構成 サービス、正しいローカライズされた文字列が何であるかを調べるための実装はありません。それを別のサービスに入れます。なぜなら、ローカリゼーション構成の変更を可能にする方法を公開したくない場所で使用できるからです。
たとえば、アプリケーションの管理面では、ローカリゼーション構成サービスとローカリゼーション文字列レンダリングサービスの両方が必要です(管理サイトもローカライズできます。)システム構成の変更は望ましくなく、そのサイトの範囲外である必要があるため、ローカリゼーション文字列レンダリングサービス。
したがって、最終的にあなたの質問に答えるために:コントローラーにはロケールとシステムの構成サービスの両方への参照が含まれており、コントローラーはビューに専念しています - それは明確に定義された契約を持っています。 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; }
// ...
}