我不确定SO是否是提出问题的正确位置,但是现有的SO问题没有多大帮助(例如 Autofac and Func factories ),Autofac document 也没有太大帮助帮助,和谷歌搜索autofac factory func
也无法得到答案。我有 DI 和 IoC 的基本知识。
主要目标是试图理解一个~1k stared github repo ReactiveTrader ,演示了在实际应用中使用响应式(Reactive)扩展。我已经成功构建(尽管花费了一些努力)并运行了服务器和客户端。这确实是非常好的学习 Material !
在阅读代码时,我被几个构造函数注入(inject)所困扰,如下所示:
public SpotTilesViewModel(IReactiveTrader reactiveTrader,
Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel> spotTileFactory,
IConcurrencyService concurrencyService,
ILoggerFactory loggerFactory)
有一个Func<TSource1, TSource2, TTarget>
在构造函数中调用了 somefactory ,没有对构造函数的显式引用(所以它一定是 DI 对吗?),并且没有注册 Func 类型的代码(在上面我提到的答案中使用) :
builder.RegisterType<Func...
所以我很好奇为什么会这样Func<>
构造函数中的工厂很有用,它是如何工作的,如果可能的话,你能给出一个最简单的演示吗?非常感谢!
最佳答案
我既不熟悉 Autofac 的特定功能,也不熟悉您所引用的代码库,但某些 DI 容器支持自动生成函数。毕竟,函数(或委托(delegate))是 just an anonymous interface ;这是建模多态性的另一种方法。
类型为 Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel>
的委托(delegate)是一个将返回 ISpotTileViewModel
的函数如果您提供ICurrencyPair
,则表示反对和一个 SpotTileSubscriptionMode
。这与这样的接口(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)
看起来有点拗口,但有 ICurrencyPair
和SpotTileSubscriptionMode
,以及其他四个函数。
DI 容器现在必须弄清楚如何(如果可能)创建这六个构造函数参数中的每一个。它递归地遍历映射表,直到找到答案或不得不放弃。这个过程就是 Steven van Deursen 和我在 DIPPP 中所说的自动接线。 .
我的猜测是,DI 容器具有此处使用的大多数多态类型的映射:ISpotTileAffirmationViewModel
, ISpotTileErrorViewModel
, 等等。可能的异常(exception)(但我在这里推测)正是 ICurrencyPair
和SpotTileSubscriptionMode
。但是,如果您提供了这两个缺失的部分,DI 容器就知道如何映射拼图的所有其他部分,并且通过反射发出,它能够“在运行时编码”类型为 Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel>
的函数。 .
关于C# DI Func工厂无需注册Func?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63770302/