给定以下类层次结构
- A类需要B类
- B类需要C类
我们得到一个像这样的依赖图:
ClassA --> ClassB --> ClassC
因此,如果我们使用 DI,我们将 ClassC 注入到 ClassB 中,将 ClassB 注入到 ClassA 中。
但是现在假设 ClassC 是一个运行时依赖项(例如某种策略)。注入运行时依赖项的建议方法是引入一个抽象工厂,如
ClassCFactory
现在我们可以将 ClassCFactory 注入 ClassB 并得到下图
ClassA --> ClassB --> ClassCFactory
现在我们在 ClassB 中有一个方法,我们可以调用它来让工厂完成它的工作。例如
ObjB.SelectC(MyRuntimeValue)
但现在在我们的应用程序中,我们对 ClassB 一无所知(可能涉及更多层)。一种解决方案可能是在 ClassA 中有一个 SelectC
ObjA.SelectC(MyRuntimeValue) -(calls)-> ObjB.SelectC(MyRuntimeValue)
或者我们只是违反得墨忒耳法则并做类似的事情
ObjA.ObjB.SelectC(MyRuntimeValue)
我想每个人都同意第二种解决方案不是要走的路。但是第一个解决方案也有几个缺点,特别是如果我们之间有更多的层。
我们也可以将工厂上拉一级来创建 ClassB,但 ClassB 真的是运行时依赖吗?你建议什么解决方案?或者它甚至是一个糟糕的类设计?
恕我直言,最好依赖于对象实际需要什么来完成其工作,而不是依赖于创建所需对象的工厂。但是考虑到这个想法,DI容器将毫无用处......