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的反模式!?