0

抽象出 Autofac 的工厂方法支持的正确方法是什么?

我不断收到此异常:

此解析操作已结束。使用 lambda 注册组件时,无法存储 lambda 的 IComponentContext 'c' 参数。相反,要么从“c”再次解析 IComponentContext,要么解析基于 Func<> 的工厂以从中创建后续组件。

这是我总结的尝试。

public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
   _containerBuilder.Register<Func<Type, T>>(c => {
      var ctx = c.Resolve<IComponentContext>();
      return request => factoryMethod(new AutofacFactoryContext(ctx));
   });
}

我什至试过

public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
   _containerBuilder.Register<Func<Type, T>>(c => {
      var ctx = c.Resolve<IComponentContext>();
      return request => factoryMethod(new AutofacFactoryContext((IComponentContext)ctx.Resolve(request)));
   });
}

我想要一个返回的方法T

AutofacFactoryContext是 的实现IFactoryContext,它只是 Autofac 的IComponentContext.

最后,这是我期待的结果:

 bootstrapper.Register<IFoo>(c => new Foobar());

在使用容器时:

 var foobar = container.Resolve<IFoo>();
4

1 回答 1

0

我想以下方法会起作用:

public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
   _containerBuilder.Register<Func<Type, T>>(c =>
      request => {
          var ctx = c.Resolve<IComponentContext>();
          factoryMethod(new AutofacFactoryContext(ctx));
   });
}

但是,请注意,这不会使用request,就像您的第一个示例一样。由于我不确定您要在这里实现什么目标,因此我无法提出更好的选择。

于 2012-11-13T20:13:18.900 回答