我正在使用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);
};
});