在对象中使用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<>基于工厂创建后续组件。
我完全明白为什么这不起作用。我想知道的是,是否有另一种方法可以做我正在尝试做的事情,那就是解析方法中的类型(我不能通过构造函数传递它,因为当时我不知道类型)。有什么想法吗?谢谢你的帮助。
您可以这样做,但您的注册肯定是错误的。我猜你有。。。
builder.Register(c => new MessagePublisher(c));
但是你需要做
builder.Register(c => new MessagePublisher(c.Resolve<IComponentContext>()));
也就是说,让普通类直接访问DI位通常是一种反模式,但有时一些管道/框架代码可能需要这样做。