gpt4 book ai didi

c# - 何时何地在运行时调用工厂?

转载 作者:太空狗 更新时间:2023-10-29 21:29:47 25 4
gpt4 key购买 nike

我最近询问了如何正确地进行 DI,并获得了一些指向相关博客文章的链接。我想我现在有了更好的理解——将对象构造与逻辑分开,将其放入工厂。但是所有的例子都是针对网站之类的,并说要在启动时进行所有布线。调用一个大型工厂,它新建所有内容并传入所有依赖项。

但是,如果我不想预先实例化所有内容怎么办?我有一个对象,其中包含它可以委托(delegate)给的其他对象的列表,但它们很昂贵,并且一次使用一个,所以我在需要时构造它们,并在完成后收集它们。我不想将 new B() 放入 A 的逻辑中,因为我宁愿使用 DI - 但是如何呢? A 可以调用工厂吗?这似乎并没有好多少,除非工厂正在维护包括当前依赖项在内的状态。我只是不想在构造时将 B 的完整列表传递给 A,因为这会很浪费。如果您愿意,B 不一定必须位于A 内,尽管它符合逻辑(A是一个游戏关卡,B 是一个屏幕),但在任何情况下,A 的逻辑都决定了何时创建 B

那么,谁调用工厂获取 B,什么时候获取?

澄清:我没有使用 DI 框架。我想知道 DI 一词是否暗示了这一点?

最佳答案

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

Autofac 将自动提供 Func<B>如果B已经注册。

或者,您可以采用更直接的方法并为 B 定义一个明确的工厂。 ,并在构造函数中请求该工厂;它只是更多的输入,因为您必须为每个要延迟初始化的依赖项创建一个工厂。


这是另一个显示 Ninject 风格工厂方法的 SO 答案:How do I handle classes with static methods with Ninject?


@Not Using A Framework:如果可以,我可能会考虑使用一个:IoC/DI 框架通常会立即为您处理延迟创建。

如果您想继续推出自己的产品,只需将创建 B 的工厂传递给您的 A 对象即可。或者,如果您只是不喜欢原始函数并且不想为所有对象创建显式工厂,那么您可以考虑使用 Lazy<B>以获得更正式的解决方案。

关于c# - 何时何地在运行时调用工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com