据我所了解的 Application Service 层,该层必须为无状态,即它不应在属性或字段中存储任何动态数据。因此,不同的Application Service实例将执行几乎相同的操作。那是否意味着我们可以将其实现为 static 类还是使用 singleton 模式?
答案 0 :(得分:2)
无状态服务应在调用相关方法时传递所有状态。应用程序服务本身可能还会注入其他依赖项。
依赖反转是您的朋友,我不建议您使用static
类。宁可使用一些具有单例模式的依赖项注入,并且如果您愿意,我建议使用依赖项注入容器,例如Castle Windsor,StructureMap,Autofac,Ninject,Unity或SimpleInjector ---我确定还有其他。
如果您遇到需要状态的单身人士,我会在上面加上一个简短的video。
答案 1 :(得分:1)
我引用this pluralsight course by Julie Lerman & Steve Smith。
域服务应该是无状态的,尽管它们可能有优势 效果。这意味着我们应该总是能够简单地创建 服务的新实例以执行操作,而不是执行 必须依赖于 特定的服务实例。但是,当然,调用 服务上的方法可能会导致系统状态更改 本身。
相同的概念适用于应用程序服务。请注意,无状态并不表示static
。例如,我们可以有一个EmailSenderService
...该服务发送一封电子邮件,并可能返回成功/失败。稍后,如果我们要发送另一封电子邮件,我们将实例化一个新的EmailSenderService
来发送电子邮件...我们不依赖于先前的电子邮件发送成功与否的事实。
正如Eben所指出的那样,服务通常被注入到消费者中,static
类型无法被注入,这是不使用static
服务的一个很好的原因。
这是really good article by Jimmy Bogard about services in DDD。
我还建议检查此project by Dino Esposito,作为DDD示例项目。
答案 2 :(得分:0)
状态性是一个概念,人们在服务中使用它来表示不同的事物。
至少,它不应该记住两次调用之间有关请求的任何事情。
通过扩展定义,它应minimize the amount of state information进行管理。
无论如何,静态或单例都不是提供无状态服务所必需或足够的。静态服务可以完全是有状态的,单例服务也可以是有状态的。
换句话说,即使您使用非静态,非单一类,所有无状态属性也可以成立。除非您有其他充分的理由要使用这些方法,否则应该将其设为默认模式。