【问题标题】:are IoC containers singletons or static?IoC 容器是单例的还是静态的?
【发布时间】:2013-07-17 03:45:48
【问题描述】:

我想更好地了解 IoC 容器的工作原理并编写一些代码供自己使用。为容器创建类时是否有最佳实践?是单例吗?是静态的吗?它不是单例,而是只有一堆静态属性来保存已解析的对象吗?

【问题讨论】:

    标签: java oop inversion-of-control


    【解决方案1】:

    我所知道的 IoC 容器既不是静态的也不是单例的,我看不出有什么好的理由来制作它们。只需将其设为普通类并创建它的实例即可。在某些情况下,您可能希望使用多个实例来分离独立的关注点。

    由于您想让组件与容器无关,即不要让它们引用容器。如果您的组件(由容器解析的对象)需要能够访问容器以获取新实例,您通常会为此抽象一个接口(通常称为Service Locator Pattern(.NET,但仅此而已)同样)),并让容器将自己注入到组件中。同样,没有理由使用静态类或方法。

    遵循这种做法的一个很好的理由是,您可以交换容器实现,例如切换到“专业”IoC 框架,而根本无需接触您的组件。

    除此之外,通常对静态类和方法有许多限制,这是您通常不希望的,尤其是当您的系统可能发生更改、增长和变得复杂时。提二:静态类不能实现接口。因此,您永远不能为了测试目的而模拟您的容器;容器的每次使用都需要对容器组件而不是合同的固定引用。您不能子类化静态类;

    【讨论】:

    • 许多 IoC 容器允许您将类标记为单例。每当您向容器请求该类的对象时,它都会查看该对象之前是否已创建,并返回已创建的对象。在不将 IoC 对象传递给每个创建的对象的情况下,如何跨多个类实现这一点?
    • 单例“服务”的实例只在一个容器实例的范围内共享。仅当每个容器都有自己的工作域且没有任何相互依赖关系时,使用多个容器才有意义。在一个正常的应用程序中,您在引导序列中创建一个容器,主要是在启动之后,然后您使用这个实例来解决所有问题。
    • 啊,我明白了。我正在为Android开发。我想这就是为什么已经有 DI 框架的原因,因为 Android 会为您创建一些您几乎无法控制的对象。
    • 我对 Android 一无所知,抱歉.. 构建一个简单的 IoC 容器并不需要太多,但它确实可以构建一个适合生产的容器。构建自己的主题以开始该主题是完全可以的,但不要使其成为静态的;) 静态类和方法有一些一般限制,您只是不希望在需要维护的类上至关重要,即可测试性、继承性或完全失去使用容器接口的能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多