依赖注入和Java包

时间:2011-03-18 15:35:11

标签: java dependency-injection packages

我正在做一个有几个包的项目。我的所有类都是根据依赖注入ideias实现的。

现在,在我的应用程序中,将会有一些地方负责实例化所有对象(实际上我正在使用IoC容器,但这无关紧要) - 所谓的组成根。

现在,问题在于,至少根据我的理解,组合根将必须知道将用于系统的所有类。也就是说,所有课程都必须标记为公开。

我可以为每个包定义一个Package Composition Root,然后从系统的组合Root调用它们中的每一个,但这似乎不是一个好主意。

例如,在C#中,情况并不严重,因为没有受包保护的访问修饰符 - 而是内部(可以访问当前程序集的所有元素)。

你们一般如何处理这个问题?

4 个答案:

答案 0 :(得分:4)

大多数容器通过使用反射来绕过访问限制。然而,当实际的relfection允许你忽略访问修饰符时,这只是让你感觉自己有一些保护的黑客。

恕我直言,如果您正在访问另一个包中的类,您应该清楚这一点,并为其提供适当的访问修饰符。

答案 1 :(得分:4)

听起来像C#中的情况是一样的。如果bean工厂在一个包之外,并且开发人员在内部创建一个类,那是不是拒绝访问bean工厂?

我把这些课程公之于众,并不担心这些。

根据定义,客户端应使用的接口是公共的。由于他们没有直接实例化或使用实现,因此几乎不用担心让他们公开访问。

另一种方法是创建一个工厂方法并使其可供bean工厂使用。让它选择使用公共工厂为给定实现提供哪种实现。

答案 2 :(得分:3)

  

现在,问题在于,至少根据我的理解,组合根将必须知道将用于系统的所有类。也就是说,所有课程都必须标记为公开   ...
  你们这些人通常如何处理这个问题?

将所有类标记为public。这在Java世界中并不是一个真正的问题。

答案 3 :(得分:0)

这是一个老问题,但我认为仍然讨论这个问题非常重要。虽然其他人试图说将包的类公开以供组合访问没有问题,但我完全不同意。包最重要的功能是使用访问修饰符隐藏其他人的详细信息。你可以争论细节词,并说提供其主要功能的包的主类不是包的细节。当您使用多态接口将您的包与外部世界隔离时,我会回答,该主类也是细节的一部分。当您希望在编译时借助语言特性来保护您的软件架构不被团队中的其他开发人员侵犯时,限制对该主类的访问是很有用的。如果你在 Python 中没有这样的功能,我为你感到抱歉,但这并不意味着 Java、C# 等中没有必要使用这么好的功能。

假设您有一个使用多态接口与外部世界通信的包,并且其所有内部类型都受访问限制。那么,在所有包中进行组合操作时,如何在组合阶段初始化实现该接口的主类呢?这是主要问题。

正如 Devoured 自己也提到的,除了在每个包中定义一个公共 composer 之外别无他法,它实例化和组合所有内部类型,并最终返回一个多态接口类型的对象,将这个模块与外部世界隔离。< /p>