在对象中使用Autofac进行解析

本文关键字:Autofac 对象 | 更新日期: 2023-09-27 18:20:52

我有如下类:

public class MessagePublisher : IMessagePublisher
{
    private readonly IComponentContext componentContext;
    public MessagePublisher(IComponentContext componentContext)
    {
        this.componentContext = componentContext;
    }
    public void PublishMessage<T>(T message) where T : class
    {
        var messageConsumers = componentContext.Resolve<IEnumerable<IMessageConsumer<T>>>();
        foreach (IMessageConsumer<T> messageConsumer in messageConsumers)
        {
            // Do some stuff.
        }
    }
}

}

这个。。。不起作用。我从Autofac收到一个错误,指示我不能像现在这样存储组件上下文,这是有道理的。

此解析操作已结束。使用lambda注册组件时,无法存储lambda的IComponentContext"c"参数。相反,从"c"再次解析IComponentContext,或者解析Func<>基于工厂创建后续组件。

我完全明白为什么这不起作用。我想知道的是,是否有另一种方法可以做我正在尝试做的事情,那就是解析方法中的类型(我不能通过构造函数传递它,因为当时我不知道类型)。有什么想法吗?谢谢你的帮助。

在对象中使用Autofac进行解析

可以这样做,但您的注册肯定是错误的。我猜你有。。。

builder.Register(c => new MessagePublisher(c));

但是你需要做

builder.Register(c => new MessagePublisher(c.Resolve<IComponentContext>()));

也就是说,让普通类直接访问DI位通常是一种反模式,但有时一些管道/框架代码可能需要这样做。