C# DI Func工厂无需注册Func?

标签 c# design-patterns dependency-injection inversion-of-control autofac

我不确定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)

看起来有点拗口,但有 ICurrencyPairSpotTileSubscriptionMode ,以及其他四个函数。

DI 容器现在必须弄清楚如何(如果可能)创建这六个构造函数参数中的每一个。它递归地遍历映射表,直到找到答案或不得不放弃。这个过程就是 Steven van Deursen 和我在 DIPPP 中所说的自动接线。 .

我的猜测是,DI 容器具有此处使用的大多数多态类型的映射:ISpotTileAffirmationViewModel , ISpotTileErrorViewModel , 等等。可能的异常(exception)(但我在这里推测)正是 ICurrencyPairSpotTileSubscriptionMode 。但是,如果您提供了这两个缺失的部分,DI 容器就知道如何映射拼图的所有其他部分,并且通过反射发出,它能够“在运行时编码”类型为 Func<ICurrencyPair, SpotTileSubscriptionMode, ISpotTileViewModel> 的函数。 .

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

相关文章:

c# - 显式转换运算符中的 void* 是什么,它的用途是什么?

java - Dagger2 如何基于java类进行注入(inject)?

c# - 如何更改 TextCompositionEventArgs 中的文本

php - 新对象的实例化或重复使用相同的对象来存储数据

java - Java 中简化的单例模式

java - 具有相同方法名称的两个接口(interface) - 方法的实现

asp.net - 通过统一注入(inject)使用工作单元的正确方法

c# - 应该如何使一个具有依赖项的类可以在不膨胀的情况下进行单元测试?

c# - 多个用户但将数据存储在同一个表中

c# - 在可以修改的类上使用扩展方法是否可以接受