何时何地在运行时调用工厂?

Tes*_*rex 6 c# factory dependency-injection

我最近问过正确地做DI,并获得了一些关于它的博客文章的链接.我想我现在有了更好的理解 - 通过将它放在工厂中,将逻辑分离出来.但是所有的例子都是针对像网站这样的东西,并且说要在启动时做所有的接线.调用一个大工厂,它可以new传递所有依赖关系.

但是,如果我不想在前面实例化所有内容呢?我有一个对象,其中包含可以委派给的其他对象的列表,但它们很昂贵,并且一次只使用一个,所以我在需要时构建它们,并在完成后让它们被收集.我不想把它new B()放在逻辑中A因为我宁愿使用DI - 但是如何?可以A打电话给工厂吗?除非工厂维持包括当前依赖关系的状态,否则这似乎并没有好多少.我只是不想将Bs 的完整列表传递到A构造时,因为它会浪费.如果你愿意,B不一定必须在里面A,虽然它具有逻辑意义(A是一个游戏级别,B是一个单一的屏幕),但无论如何,逻辑A决定何时B创建.

那么,谁叫工厂得到B,什么时候?

澄清:我没有使用DI的框架.我想知道DI一词是否意味着?

Dav*_*vre 6

在Ninject中,您可以Func<B>在构造函数中注册并请求A.

Func<B>如果B已经注册,Autofac将自动供应.

或者,您可以采用更直接的方法并为其定义显式工厂B,并在构造函数中请求该工厂; 它只是更多的打字,因为你必须为你想懒洋洋地初始化的每个依赖创建一个工厂.


这是另一个显示Ninject样式工厂方法的SO答案:如何使用Ninject处理带静态方法的类?


@Not使用框架:如果可以的话,我可能会考虑使用一个框架:IoC/DI框架通常会为您提供开箱即用的延迟创建.

如果你想继续自己动手,那么只需将创建B的工厂传递给你的A对象.或者,如果您不喜欢原始Func并且不想为所有对象创建显式工厂,那么您可以考虑使用Lazy<B>更正式的解决方案.