我正在使用Caliburn.Micro和Autofac开发应用程序。
在我的合成根目录下,我现在面临Autofac的问题:
我必须将全局使用的IEventAggregator注入(inject)到我的FirstViewModel中,并注入(inject)第二个IEventAggregator,该IEventAggregator仅必须由此FirstViewModel及其子级使用。
我的想法是使第二个作为Owned<IEA>注入(inject),并且它可以工作,容器提供了另一个IEA实例。

public FirstViewModel(
    IEventAggregator globalEA,
    IEventAggregator localEA,
    Func<IEventAggregator, SecondViewModel> secVMFactory) {}
当我必须向SecondViewModel提供事件聚合器时,就会出现问题。
为了创建SecondViewModel,我将工厂方法用作Func<IEA, SecondVM>
SecondViewModel的构造函数如下:public SecondViewModel(IEventAggregator globalEA, IEventAggregator localEA) {}我希望容器将第一个作为已注册的容器注入(inject),第二个将是Func<IEA, SecVM>的IEA参数。
这是我在容器中注册的功能:
builder.Register<Func<IEventAggregator, SecondViewModel>>(
     c =>
         (ea) =>
         {
             return new SecondViewModel(
                 c.Resolve<IEventAggregator>(),
                 ea);
         }
);
但是当它被FirstViewModel调用时,出现以下错误:

我不明白问题出在哪里,请您能帮我,我在想什么?
谢谢你。

最佳答案

您在secVMFactory构造函数之外调用FirstViewModel,因此到那时处置ResolveOperation,并且在工厂方法中c.Resolve将引发异常。

幸运的是,异常消息非常具有描述性,告诉您该怎么做:



因此,除了调用c.Resolve之外,您还需要从IComponentContext解析c并将其在工厂函数中使用:

builder.Register<Func<IEventAggregator, SecondViewModel>>(c => {
     var context = c.Resolve<IComponentContext>();
     return ea => {
          return new SecondViewModel(context.Resolve<IEventAggregator>(), ea);
     };
});

09-13 11:15