gpt4 book ai didi

没有注册 Func 的 C# DI Func 工厂?

转载 作者:行者123 更新时间:2023-12-04 08:56:56 25 4
gpt4 key购买 nike

我不确定 SO 是否是提出问题的正确位置,但现有的 SO 问题并没有多大帮助(例如 Autofac and Func factories ),Autofac document 也没有多大帮助帮助和谷歌搜索autofac factory func也得不到答案。我有 DI 和 IoC 的基本知识。
主要目标是试图了解大约 1k 人盯着的 github repo ReactiveTrader ,演示使用 响应式(Reactive)扩展 在现实世界的应用中。我已经成功构建(尽管付出了一些努力)并运行了服务器和客户端。它真的是极好的学习资料!
在阅读代码时,我被几个这样的构造函数注入(inject)卡住了:

public SpotTilesViewModel(IReactiveTrader reactiveTrader,
Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel> spotTileFactory,
IConcurrencyService concurrencyService,
ILoggerFactory loggerFactory)
有一个 Func<TSource1, TSource2, TTarget>打了一些电话 工厂 在构造函数中,没有对构造函数的显式引用(所以它必须是 DI 对吗?),并且没有注册 Func 类型的代码(在上面提到的 SO 答案中使用):
builder.RegisterType<Func...
所以我很好奇为什么会这样 Func<>构造函数中的工厂很有用,它是如何工作的,如果可能的话,你能给出一个最简单的演示吗?非常感谢!

最佳答案

我既不熟悉 Autofac 的特定功能,也不熟悉您所指的代码库,但一些 DI 容器支持自动生成函数。毕竟,函数(或委托(delegate))是 just an anonymous interface ;这是建模多态性的另一种方法。
类型为 Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel> 的委托(delegate)是一个返回 ISpotTileViewModel 的函数对象,如果您提供 ICurrencyPairSpotTileSubscriptionMode .这与这样的接口(interface)同构:

public interface ISpotTileViewModelFactory
{
ISpotTileViewModel Create(ICurrencyPair pair, SpotTileSubscriptionMode mode);
}
一些 DI 容器也可以自动生成这样的工厂接口(interface)。算法是这样的:
请记住,DI 容器的核心是一个从多态类型到具体类型的映射表。例如,接口(interface) ISpotTileViewModel映射到具体类型。浏览相关代码库的 GitHub 存储库,我猜 SpotTileViewModel class 是与 ISpotTileViewModel 配对的具体类型. SpotTileViewModel类有一个构造函数。因此,为了能够创建它的实例,DI 容器必须分析构造函数以找出如何调用它。它看起来像这样:
public SpotTileViewModel(
ICurrencyPair currencyPair,
SpotTileSubscriptionMode spotTileSubscriptionMode,
Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel, ISpotTilePricingViewModel> pricingFactory,
Func<ITrade, ISpotTileViewModel, ISpotTileAffirmationViewModel> affirmationFactory,
Func<string, ISpotTileViewModel, ISpotTileErrorViewModel> errorFactory,
Func<ISpotTileConfigViewModel> configFactory)
看起来有点拗口,但有 ICurrencyPairSpotTileSubscriptionMode ,以及其他四个功能。
DI 容器现在必须弄清楚它如何(如果可能)创建这六个构造函数参数中的每一个。它递归地遍历它的映射表,直到它弄清楚或不得不放弃。这个过程就是 Steven van Deursen 和我在 DIPPP 中所说的自动接线。 .
我的猜测是 DI 容器对这里的大多数多态类型都有映射: ISpotTileAffirmationViewModel , ISpotTileErrorViewModel , 等等。可能的异常(exception)(但我在这里推测)正是 ICurrencyPairSpotTileSubscriptionMode .但是,如果您提供这两个缺失的部分,DI 容器就知道如何映射拼图的所有其他部分,并且通过反射发射,它能够“在运行时编码”类型为 Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel> 的函数。 .

关于没有注册 Func 的 C# DI Func 工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63770302/

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