Architecture 国际奥委会和单身人士-何时不注入

Architecture 国际奥委会和单身人士-何时不注入,architecture,domain-driven-design,inversion-of-control,Architecture,Domain Driven Design,Inversion Of Control,阅读一些关于领域驱动设计的有趣书籍,其中一个示例如下: // Order IOrderNumberService orderNumberService; public void Accept() { this.orderNumber = this.orderNumberService.GetNextAvailableNumber(); } 上面的代码中没有显示的是,OrderNumberService是由IoC框架注入的。我们不知道服务对象的生命周期范围(可以为每次注入创建一个新服务,

阅读一些关于领域驱动设计的有趣书籍,其中一个示例如下:

// Order
IOrderNumberService orderNumberService;
public void Accept()
{
    this.orderNumber = this.orderNumberService.GetNextAvailableNumber();
}
上面的代码中没有显示的是,
OrderNumberService
是由IoC框架注入的。我们不知道服务对象的生命周期范围(可以为每次注入创建一个新服务,或者每次注入一个单例)

对于其工作是从数据库中检查下一个可用号码的服务,我认为不需要任何状态,并且可以安全地(可能应该)使用单例

在这种情况下,我不认为有必要交换这个服务,可以直接调用singleton类的具体实现
OrderNumberService.GetNextAvailableNumber()
,或者至少如果我需要使用接口进行抽象,我可以随时在以后重构

除了从实现中抽象服务接口以便于测试之外,注入服务还有其他好处吗


我很小心把我读到的所有东西都放进代码中,因为它们很酷——那么抽象在什么时候会产生这么多层,使代码更难阅读?应该注意哪些警告标志?

服务在DDD中没有状态(Evans p.107),不管它们属于哪一层

当域中的重要过程或转换不是 实体或价值对象的自然责任,添加操作 将模型作为声明为服务的独立接口。定义 根据模型的语言定义接口,并确保 操作名是通用语言的一部分提供服务 无国籍

使用高级抽象(接口)而不是实现(类)是,也不是依赖项注入,依赖项反转是关于抽象和实现的关系,而依赖项注入是关于删除硬编码的依赖项-即使您的字段是一个接口,您仍然需要以某种方式对其进行初始化,也就是给某个类实例赋值

至于注入服务实例的技术,DDD与技术无关。如果您认为使用IOC容器使事情更难阅读,您可以考虑使用服务定位器模式,而对于完整的推理,请参见。但是tbh DDD需要一些成熟的团队(Evans在infoq上的一些演讲中提到了这一点),所以我认为只有人们才能掌握IoC的概念,所以Service Locator在这里没有太大的优势(除非你在一些有限的环境中工作,比如Android手机,IoC框架太重的解决方案)

至于臭名昭著的单例模式(使用静态类方法实现),我认为它根本不适合,因为它不可测试


此外,DDD还提倡使用轻量级的框架(见架构框架,Evans第74页),而当代框架(Spring、Fluent NHibernate等)正是基于这一点开发的,因此它们实际上是为了简化POJO/POCO的使用(您可以在一系列关于框架设计的文章中阅读更多内容,这些文章由流畅的NHibernate架构师Jeremy Miller撰写),例如,许多Spring项目直接引用DDD。因此,框架不太可能强制您在代码中添加依赖项,或者降低代码的可读性-它宁愿使用反射API来设置值,并将使用一些非侵入性方法,如XML或属性(注释)对于配置。

服务在DDD中没有状态(Evans第107页),无论它们属于哪一层

当域中的重要过程或转换不是 实体或价值对象的自然责任,添加操作 将模型作为声明为服务的独立接口。定义 根据模型的语言定义接口,并确保 操作名称是通用语言的一部分。创建服务 无国籍

使用高级抽象(接口)而不是实现(类)依赖项反转是关于抽象和实现之间的关系,而依赖项注入是关于删除硬编码的依赖项——即使您的字段是一个接口,您仍然需要以某种方式对其进行初始化,即为某个类实例赋值

关于注入服务实例的技术,DDD是技术不可知的。如果您认为使用IOC容器使事情变得更难阅读,您可以考虑使用服务定位器模式来代替,为了充分推理,但是TBH DDD需要一些复杂的团队(伊万斯在InFoQ的一些谈话中提到它)。因此,我认为能够掌握IoC概念的将是人们,因此Service Locator在这里没有太大的优势(除非你在一些有限的环境中工作,比如Android手机,IoC框架太重的解决方案)

至于臭名昭著的单例模式(使用静态类方法实现),我认为它根本不适合,因为它不可测试

此外,DDD还提倡使用轻量级的框架(见架构框架,Evans第74页),而当代框架(Spring、Fluent NHibernate等)正是基于这一点开发的,因此它们实际上是为了简化POJO/POCO的使用(您可以在一系列关于框架设计的文章中阅读更多内容,这些文章由流畅的NHibernate架构师Jeremy Miller撰写),例如,许多Spring项目直接引用DDD。因此,框架不太可能强制您在代码中添加依赖项,或者降低代码的可读性-它宁愿使用反射API来设置值,并将使用一些非侵入性的方法,如XML或属性(注释)来进行配置

除了抽象出