摘要Autofac的工厂方法支持

时间:2012-11-13 20:03:06

标签: c# inversion-of-control autofac

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

我一直得到这个例外:

  

此解决操作已经结束。使用lambdas注册组件时,   无法存储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的方法。

AutofacFactoryContextIFactoryContext的一个实现,它只是Autofac IComponentContext的一个包装。

最后这是我期待的结果:

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

使用容器时:

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

1 个答案:

答案 0 :(得分: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,就像您的第一个示例一样。由于我不确定你想在这里实现什么目标,我无法提出更好的选择。