在对象中使用Autofac进行解析

时间:2014-09-05 17:37:48

标签: c# autofac

我有类似下面的课程:

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;基于工厂从中创建后续组件。

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

1 个答案:

答案 0 :(得分:3)

可以这样做,但你必须注册错误。我猜你有类似......

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

但你需要做

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

话虽这么说,给普通类直接访问你的DI位通常是反模式,但有时一些管道/框架代码可能需要这样做。