【问题标题】:Understanding Autofac configuration for Mediatr了解 Mediatr 的 Autofac 配置
【发布时间】:2019-11-28 05:16:58
【问题描述】:

我正在尝试使用 Autofac 配置 Mediatrdocumentation 显示了如何配置它,但我不明白 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# autofac mediatr


    【解决方案1】:

    我的理解是,解析ServiceFactory的时候,Autofac会解析匿名函数

    你是对的。

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

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

    builder.Register<ServiceFactory>(ctx =>
    {
        return t => ctx.Resolve(t);
    });
    

    当您调用 ServiceFactory 委托时,您将拥有一个 ObjectDisposedException

    System.ObjectDisposedException: 这个解析操作已经结束。使用 lambda 注册组件时,无法存储 lambda 的 IComponentContext 'ctx' 参数。相反,要么从 'ctx' 再次解析 IComponentContext,要么解析基于 Func&lt;&gt; 的工厂以从中创建后续组件。

    Register 方法提供的ctx 仅用于注册过程,将在注册过程结束时释放。这就是为什么您必须解决另一个 IComponentContext 才能获得一个在整个生命周期范围内都有效的原因。

    【讨论】:

    • 这完全有道理。我在测试中没有遇到 ObjectDisposedException,但我只进行了简单的调试会话,这可能无法反映真实的工作条件。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多