C# 在对象内使用Autofac进行解析
我有如下课程:C# 在对象内使用Autofac进行解析,c#,autofac,C#,Autofac,我有如下课程: public class MessagePublisher : IMessagePublisher { private readonly IComponentContext componentContext; public MessagePublisher(IComponentContext componentContext) { this.componentContext = componentContext; } p
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.
}
}
}
公共类MessagePublisher:IMessagePublisher
{
私有只读IComponentContext组件上下文;
公共消息发布者(IComponentContext组件上下文)
{
this.componentContext=componentContext;
}
public void PublishMessage(T message),其中T:class
{
var messageConsumers=componentContext.Resolve();
foreach(messageConsumers中的IMessageConsumer messageConsumer)
{
//做点什么。
}
}
}
}
这个。。。不起作用。我从Autofac得到一个错误,表明我不能像以前那样存储组件上下文,这是有道理的
此解析操作已结束。使用lambda注册组件时,无法将IComponentContext“c”参数存储到lambda。相反,请从“c”再次解析IComponentContext,或解析基于Func的工厂以从中创建后续组件
我完全明白为什么这行不通。我想知道的是,是否有另一种方法来完成我正在尝试做的事情,那就是在一个方法中解析一个类型(我不能通过构造函数传递它,因为我当时不知道类型)。有什么想法吗?谢谢您的帮助。您可以这样做,但您一定是注册错误了。我猜你有点像
builder.Register(c => new MessagePublisher(c));
但你需要这样做
builder.Register(c => new MessagePublisher(c.Resolve<IComponentContext>()));
builder.Register(c=>newmessagepublisher(c.Resolve());
也就是说,让普通类直接访问DI位通常是一种反模式,但有时一些管道/框架代码可能需要这样做。我想这被认为是DI的反模式!?