我有类似下面的课程:
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得到一个错误,表明我不能像我一样存储组件上下文,这是有道理的。
此解决操作已经结束。使用lambdas注册组件时,无法存储lambda的IComponentContext'c'参数。相反,要么从'c'再次解析IComponentContext,要么解析Func&lt;&gt;基于工厂从中创建后续组件。
我完全明白为什么这不起作用。我想知道的是,是否有另一种方法来做我正在尝试做的事情,即解决方法中的类型(我无法通过构造函数传递它,因为我不知道类型在那时候)。有任何想法吗?谢谢你的帮助。
答案 0 :(得分:3)
你可以这样做,但你必须注册错误。我猜你有类似......
builder.Register(c => new MessagePublisher(c));
但你需要做
builder.Register(c => new MessagePublisher(c.Resolve<IComponentContext>()));
话虽这么说,给普通类直接访问你的DI位通常是反模式,但有时一些管道/框架代码可能需要这样做。