dependency-injection - DDD : Service and Repositories Instances Injected with DI as Singletons

标签 dependency-injection singleton domain-driven-design ddd-repositories

我最近的观点受到了挑战,即单例仅适用于日志记录和配置。通过依赖注入(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/

相关文章:

c# - 单例规则题(不允许创建副本和反序列化)

doctrine-orm - DDD、Doctrine2、聚合和 ArrayCollection : how to isolate the domain model?

c# - 将 IoC 容器作为依赖项注入(inject)有多糟糕?

c# - 依赖注入(inject) : ASP vNext. 这是如何工作的?

.net - 如何在 Spring.net 中注入(inject) Predicate 和 Func

c# - 如何在 C# 中重新创建单例实例

javascript - 在 Node.js 中,有没有办法从所需模块访问父级的变量范围?

java - 如何修复 dagger2 库中的 "cannot be provided without an @Provides-annotated method"错误

design-patterns - 在域对象方法中封装服务调用

domain-driven-design - 为什么传奇(又名流程管理器)包含内部状态,为什么它们会持久化到事件存储中?