我的目的不是就 DDD 中的验证、代码所属的位置等进行辩论,而是专注于一种可能的方法以及如何解决本地化问题。我在我的一个域对象(实体)上具有以下行为(方法),它举例说明了这种情况:
public void ClockIn()
{
if (WasTerminated)
{
throw new InvalidOperationException("Cannot clock-in a terminated employee.");
}
ClockedInAt = DateTime.Now;
:
}
可以看到,当调用 ClockIn 方法时,该方法会检查对象的状态以确保 Employee 没有被终止。如果 Employee 被终止,我们会抛出一个与“不要让你的实体进入无效状态”方法一致的异常。
我的问题是我需要本地化异常消息。这通常使用应用程序服务 (ILocalizationService) 完成(在此应用程序中),该应用程序服务是使用 MEF 在需要访问其方法的类中导入的。但是,与任何 DI 框架一样,只有在容器实例化对象时才会注入/导入依赖项。DDD 通常不是这种情况。
此外,我所了解的有关 DDD 的所有内容都表明我们的域对象不应该有依赖关系,并且这些问题应该在域对象的外部处理。如果是这种情况,我该如何本地化如上图所示的消息?
这不是一个新要求,因为许多业务应用程序都需要全球化/本地化。我会很感激一些建议如何使这项工作仍然与 DDD 的目标保持一致。
更新
我最初没有指出我们的本地化都是数据库驱动的,所以我们确实有一个本地化服务(通过可注入的 ILocalizationService 接口)。因此,使用 Visual Studio 作为项目一部分提供的静态资源类不是一个可行的选择。
另一个更新
也许它会推动讨论,说明该应用程序是一个 RESTful 服务应用程序。因此,客户端可以是一个简单的网络浏览器。因此,我不能期望调用者可以执行任何类型的本地化、代码映射等进行编码。当发生异常时(在这种方法中,尝试将域对象置于无效状态是异常),抛出异常并返回相应的 HTTP 状态代码以及异常消息,该异常消息应本地化为调用者的文化(接受语言)。