我最近的观点受到了挑战,即单例仅适用于日志记录和配置。通过依赖注入(inject),我现在没有看到为什么您不能将服务或存储库作为单例使用的原因。
不存在耦合,因为 DI 通过接口(interface)注入(inject)单例实例。唯一合理的论点是您的服务可能具有共享状态,但如果您考虑一下,服务应该是没有任何共享状态的独立单元。是的,它们确实会被注入(inject)存储库,但您只有一种方法来创建存储库实例并将其传递给服务。由于存储库永远不应该具有共享状态,因此我看不出有任何理由说明它也不能是单例。
例如,一个简单的服务类将如下所示:
public class GraphicService : IGraphicService
{
private IGraphicRepository _rep;
public GraphicService(IGraphicRepository rep)
{
_rep = rep;
}
public void CreateGraphic()
{
...
_rep.SaveGraphic(graphic):
}
}
除了存储库之外,服务中不会共享任何状态,存储库也不会更改或拥有自己的状态。
所以问题是,如果您的服务和存储库没有任何状态,并且仅通过接口(interface)、配置或其他任何以相同方式实例化的方式传入,那么为什么不将它们作为单例?
最佳答案
如果您使用单例模式,即类的静态属性,那么您就会遇到紧密耦合问题。
如果您只需要类的单个实例,并且使用 DI 容器来控制其生命周期,那么这不是问题,因为没有任何缺点。应用程序不知道存在单例,只有 DI 容器知道。
底线,类的单个实例是有效的编码要求,唯一的问题是如何实现它。 Di 容器是最好的方法。单例模式适用于快速而肮脏的应用程序,您不太关心可维护性和测试。
关于dependency-injection - DDD : Service and Repositories Instances Injected with DI as Singletons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19327928/