C# 了解Mediatr的Autofac配置

C# 了解Mediatr的Autofac配置,c#,autofac,mediatr,C#,Autofac,Mediatr,我正在尝试配置Autofac。演示了如何配置它,但我不了解ServiceFactory注册是如何工作的 登记情况如下: builder.Register<ServiceFactory>(ctx => { var c = ctx.Resolve<IComponentContext>(); return t => c.Resolve(t); }); 但是我不明白为什么IComponentContext是从ctx解析出来的,因为ctx已经是ICompo

我正在尝试配置Autofac。演示了如何配置它,但我不了解ServiceFactory注册是如何工作的

登记情况如下:

builder.Register<ServiceFactory>(ctx =>
{
   var c = ctx.Resolve<IComponentContext>();
   return t => c.Resolve(t);
});
但是我不明白为什么
IComponentContext
是从
ctx
解析出来的,因为ctx已经是
IComponentContext

那么,以这种方式注册会有什么区别:

builder.Register<ServiceFactory>(ctx =>
{
   return t => ctx.Resolve(t);
});
builder.Register(ctx=>
{
返回t=>ctx.Resolve(t);
});
我的理解是,在解析ServiceFactory时,Autofac将解析匿名函数

你说得对

但是我不明白为什么
IComponentContext
是从
ctx
解析出来的,因为
ctx
已经是
IComponentContext

您不能使用
ctx
,因为调用委托时将释放此上下文。如果你这样做

builder.Register<ServiceFactory>(ctx =>
{
    return t => ctx.Resolve(t);
});
builder.Register(ctx=>
{
返回t=>ctx.Resolve(t);
});
调用
ServiceFactory
委托时,您将有一个
ObjectDisposedException

System.ObjectDisposedException
:此解析操作已结束。使用lambda注册组件时,无法将
IComponentContext
'ctx'参数存储到lambda。相反,可以从“ctx”再次解析
IComponentContext
,或者解析基于
Func
的工厂以从中创建后续组件


Register
方法提供的
ctx
仅用于注册过程,并将在注册过程结束时进行处理。这就是为什么您必须解析另一个
IComponentContext
,以获得一个在整个生命周期内都处于活动状态的上下文

这完全有道理。我在测试中没有遇到ObjectDisposedException,但我只进行了简单的调试会话,这些调试会话可能并不反映真实的工作条件。谢谢
builder.Register<ServiceFactory>(ctx =>
{
   return t => ctx.Resolve(t);
});
builder.Register<ServiceFactory>(ctx =>
{
    return t => ctx.Resolve(t);
});