C# 了解Mediatr的Autofac配置
我正在尝试配置Autofac。演示了如何配置它,但我不了解ServiceFactory注册是如何工作的 登记情况如下: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
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);
});