Dependency injection 是";静态域帮助器类“;环境上下文反模式?

Dependency injection 是";静态域帮助器类“;环境上下文反模式?,dependency-injection,domain-driven-design,anti-patterns,Dependency Injection,Domain Driven Design,Anti Patterns,正如Steven van Deursen和Mark Seemann在Manning的书中所定义的那样,依赖注入原则、实践和模式(我推荐必读),有一种特定的反模式令我感兴趣,那就是环境上下文反模式。还对其进行了描述。一般的问题是,如果您在静态类后面放置一些易失性依赖项,那么您将代码库的多个部分耦合到该易失性依赖项 我的困惑始于易变依赖的定义。volatile依赖项的定义之一是该依赖项仍在开发中或尚未开发。所以我的问题是:如果这种依赖关系是一些定义良好的领域知识,比如某些特定于领域的电子邮件验证器,

正如Steven van Deursen和Mark Seemann在Manning的书中所定义的那样,依赖注入原则、实践和模式(我推荐必读),有一种特定的反模式令我感兴趣,那就是环境上下文反模式。还对其进行了描述。一般的问题是,如果您在静态类后面放置一些易失性依赖项,那么您将代码库的多个部分耦合到该易失性依赖项

我的困惑始于易变依赖的定义。volatile依赖项的定义之一是该依赖项仍在开发中或尚未开发。所以我的问题是:如果这种依赖关系是一些定义良好的领域知识,比如某些特定于领域的电子邮件验证器,放在领域层中,并且它仍在进行一些代码更改,那么如果我们将其放在静态类后面并在整个代码库中使用它,它是否被视为反模式?(我们讨论的是洋葱架构,其中域位于中心,所有内容都指向域层)

编辑1

下面是一个简化的域类示例:

公共类EmailValidationService
{
私有静态只读正则表达式_emailValidationRegex=/*一些正则表达式*/;
公共静态EmailValidationStatus有效(字符串电子邮件)
{
var isValid=_emailValidationRegex.Match(email).Length>0;
返回有效;
}
}
此验证器的使用者分为多个层次,例如用户输入验证、文件导入验证等。以下是两个简化的使用者:

公共类RawDataImporter{
私人员工流程员工(EmployeeRowData数据)
{
if(string.IsNullOrEmpty(data.Identifier)){return new InvalidEmployee();}
if(EmailValidationService.IsValid(data.Identifier){返回新员工(data.Identifier);}
}
}
公共类属性:
验证属性
{
公共覆盖布尔值有效(对象值)
{
var status=EmailValidationService.IsValid((字符串)值);
if(status.IsValid)
{
返回true;
}
返回false;
}
}
volatile依赖项的定义之一是该依赖项仍在开发中或尚未开发

令我恐惧的是,书中的这句话(我是合著者)并没有详细阐述。这本书是这么说的:

如果依赖项不存在或仍在开发中,则应将其视为不稳定的依赖项。

就这样。没有给出更多的信息。幸运的是,第一版包含了更多的信息。在第一版中,前面的语句后面是以下句子:

这种依赖性的明显症状是无法进行并行开发。

我不得不挖掘出为什么我们删除了这句话,但校对员的反馈表明,这第二句话有点让人困惑。但我们没有改进这句话,而是(意外地)删除了它。保留“并行开发”的概念在这一要点中,将非常有用,因为它引用了第1.2.2节,该节说明了以下关于并行开发的内容:

当一个软件开发项目发展到一定规模时,有必要让多个开发人员在同一个代码库上并行工作。在更大的规模上,甚至有必要将开发团队分成多个可管理规模的团队。每个团队通常负责整个应用程序的一个领域应用程序。为了划分职责,每个团队开发一个或多个需要集成到最终应用程序中的模块。除非每个团队的领域真正独立,否则一些团队可能会依赖其他团队开发的功能。

让我尝试纠正这本书的遗漏,并详细说明为什么仍在开发中的依赖关系可能被认为是不稳定的

当开发人员较多的应用程序时,如果不存在未开发的应用程序或无法并行开发应用程序会阻碍开发,则未开发的应用程序在功能上会变得不稳定。团队规模越大,或者开发一个软件的团队越多,这些未开发的部分会阻碍开发人员的性能

大多数在多个团队并行开发的代码库上工作的开发人员都经历过这样的情况:您更经常被其他人阻止,经历更多的合并冲突,看到更多由错误合并的代码导致的错误,更多的代码和测试因您所依赖的代码更改而中断。这些问题可能部分是由takin造成的g对其他类的硬依赖(尽管,不可否认,这种情况发生的原因还有很多)。可以通过将这些更具风险的部分隐藏在抽象后面来降低此风险。这意味着您组织的结构和大小可能会对代码库的设计和结构产生影响。您应该选择最经济高效的设计(从长远来看)

从这句话中,你可以得出结论,某个事物是易变的还是稳定的依赖关系并不总是一门硬科学。这与包含不确定性行为的依赖关系大不相同;它们总是易变的

注意:我会看看我们是否可以把这些信息放在书的勘误表中。很遗憾,在下一次印刷中更新文本是不可能的,因为这会导致页面布局和编号的级联(彻底)更改,而我们的出版商不允许这样做

如果这种依赖关系是一些定义良好的领域知识,例如某些特定于领域的电子邮件验证器,放在领域层中,并且它仍在进行一些代码更改,那么如果我们将其放在b中,它是否被视为反模式