c# - 了解 Mediatr 的 Autofac 配置
问题描述
我正在尝试使用 Autofac 配置Mediatr。文档显示了如何配置它,但我不明白 ServiceFactory 注册是如何工作的。
报名如下:
builder.Register<ServiceFactory>(ctx =>
{
var c = ctx.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
ServiceFactory 是一个代表:
/// <summary>
/// Factory method used to resolve all services. For multiple instances, it will resolve against <see cref="IEnumerable{T}" />
/// </summary>
/// <param name="serviceType">Type of service to resolve</param>
/// <returns>An instance of type <paramref name="serviceType" /></returns>
public delegate object ServiceFactory(Type serviceType);
我的理解是,在解析时ServiceFactory
,Autofac 会解析匿名函数:
t=>c.Resolve(t)
但我不明白为什么IComponentContext
从 解决ctx
,因为 ctx 已经是IComponentContext
.
那么以这种方式注册它会有什么不同:
builder.Register<ServiceFactory>(ctx =>
{
return t => ctx.Resolve(t);
});
解决方案
我的理解是解析ServiceFactory时,Autofac会解析匿名函数
你说的对。
但我不明白为什么
IComponentContext
从 解决ctx
,因为它ctx
已经是IComponentContext
.
您不能使用ctx
,因为将在调用委托时释放此上下文。如果你这样做
builder.Register<ServiceFactory>(ctx =>
{
return t => ctx.Resolve(t);
});
ObjectDisposedException
当您调用ServiceFactory
委托时,您将有一个。
System.ObjectDisposedException
: 此解析操作已经结束。使用 lambda 注册组件时,IComponentContext
无法存储 lambda 的 'ctx' 参数。相反,要么IComponentContext
从 'ctx' 再次解析,要么解析Func<>
基于工厂以从中创建后续组件。
该方法ctx
提供的Register
仅用于注册过程,并将在注册过程结束时处理。这就是为什么您必须解决另一个问题IComponentContext
才能获得一个在整个生命周期都存在的问题。
推荐阅读
- javascript - vue-tables-2 — 来自自定义过滤器的 $emit 没有使其回调?
- excel - 自定义宏工具栏在另一台计算机上不起作用
- svelte - 在 Svelte 中引用“this”组件
- json - 带有 Firebase 的 Google App Engine 修剪了 JSON 响应
- angular - Angular firebase 数据库列表元素是可观察的
- python-3.x - 成功 SSH 访问和 python3 升级后,Jupyter 实验室在 Colab 中不起作用
- erlang - 了解进程停止接收消息的原因
- django - 将 Django 项目部署到 Heroku
- opencv - 级联分类器不能正常工作(或者根本不工作)
- clojure - Quil 将图像加载到已创建的小程序中