首页 > 解决方案 > 了解 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);
});

标签: c#autofacmediatr

解决方案


我的理解是解析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才能获得一个在整个生命周期都存在的问题。


推荐阅读