gpt4 book ai didi

model-view-controller - 确定保存设置的职责( Controller 、服务和映射器)

转载 作者:行者123 更新时间:2023-12-04 18:45:24 25 4
gpt4 key购买 nike

编辑:

因为我迟迟没有将 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]

上表的设置将保存在一个数据库表中,该表的列映射到上列(显然不包括最后一列)。

所有(保存和删除)操作都直接发送到本地化 Controller 。 Localization Controller 基本上调用 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 的数据库表中。我想到了几个选项:

  • 在 LocalizationController 中使用 SiteService/SiteSettingsService。但是,完整的表格已经在 LocalizationService 中生成和处理了。
  • 在 LocalizationService 中使用 SiteMapperDb/SiteSettingsMapperDb 并在 updateCollection( $_POST ) 中使用它
  • 在 LocaleMapperDb 中使用 SiteMapperDb/SiteSettingsMapperDb

第一个和最后一个选项看起来是最糟糕的选项,但我不确定。你觉得最好的选择是什么?或者您有其他选择,我还没有想到?

最佳答案

我认为在这种情况下将领域模型对象投影到 View 模型对象上效果很好。

在附加代码的情况下(请原谅我用 C# 编写它;它应该是相当可移植的)域模型对象永远不会公开(它们只能在服务对象中直接访问。)服务只公开 View 模型对象,如 LocalViewModel,这些 View 模型对象由 Controller 操作。

LocaleConfigController 还将服务返回的数据映射到一个 LocaleConfigViewModel 对象中,该对象是唯一与 View 直接交换的对象。

所以,简而言之, View 有一个专用的 Controller , View 通过 LocaleConfigViewModel 对象与 Controller 通信。 Controller 操纵 LocaleConfigViewModel 对象并调用 ILocaleConfigServiceISystemConfigService 的实现。服务对象从不将域模型暴露给 Controller ,它们负责将 View 模型对象映射到域模型对象(通过任何需要的持久性机制)。

请注意,语言环境服务是一个配置 服务,它没有任何实现来查找正确的本地化字符串。我会把它放到另一个服务中,因为它可以用在您不想公开任何允许更改本地化配置的方法的地方。

例如,在应用程序的管理端,您可能需要本地化配置服务和本地化字符串呈现服务(因为管理站点也可以本地化)。对于面向客户的前端,您可能更愿意只需要本地化字符串呈现服务,因为系统配置修改应该是不需要的并且超出该站点的范围。

所以,最后回答你的问题: Controller 包含对语言环境和系统配置服务的引用,并且 Controller 专用于 View ——它有一个定义明确的契约,其中只有 LocaleConfigViewModels 被交换了。

至于保存系统范围设置的责任在哪里, Controller 负责从 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; }
// ...
}

关于model-view-controller - 确定保存设置的职责( Controller 、服务和映射器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com