我发现我的构造函数开始是这样的:

public MyClass(Container con, SomeClass1 obj1, SomeClass2, obj2.... )

随着参数列表的不断增加。既然“容器”是我的依赖注入容器,为什么我不能这样做:

public MyClass(Container con)

每一节课?缺点是什么?如果我这样做,感觉就像我在使用美化的静电。请分享你对IoC和依赖注入疯狂的想法。


当前回答

我不认为你的类构造函数应该引用你的IOC容器期。这代表了类和容器之间不必要的依赖关系(IOC试图避免的依赖类型!)

其他回答

你在使用什么依赖注入框架?你尝试过使用基于setter的注入吗?

基于构造函数的注入的好处是,对于不使用依赖注入框架的Java程序员来说,它看起来很自然。你需要5个东西来初始化一个类,然后你的构造函数有5个参数。缺点正如你所注意到的,当你有很多依赖时,它会变得笨拙。

在Spring中,你可以使用setter来传递所需的值,并且可以使用@required注释来强制注入这些值。缺点是您需要将初始化代码从构造函数移动到另一个方法,并在所有依赖项注入后通过使用@PostConstruct进行标记让Spring调用该方法。我不确定其他框架,但我认为它们做了类似的事情。

两种方法都有效,这是一个偏好的问题。

传入参数的困难不是问题。问题是你的类做的太多了,应该再分解一些。

依赖注入可以作为类变得太大的早期警告,特别是因为传递所有依赖的痛苦正在增加。

我遇到过一个类似的问题,关于基于构造函数的依赖注入,以及传递所有依赖是多么复杂。

我过去使用的方法之一是使用服务层来使用应用程序外观模式。这将有一个粗糙的API。如果此服务依赖于存储库,则它将使用私有属性的setter注入。这需要创建一个抽象工厂,并将创建存储库的逻辑移到工厂中。

详细的代码和解释可以在这里找到

复杂服务层IoC的最佳实践

我不认为你的类构造函数应该引用你的IOC容器期。这代表了类和容器之间不必要的依赖关系(IOC试图避免的依赖类型!)

一个方法的参数太多是一个暗示(不一定),你的方法太大/有太多的责任。

此外,在同一方法中使用的参数(可能)具有很高的内聚性——>值得考虑将它们放在一个类中——>只必须传递一个参数。