【问题标题】:Abstracting out Autofac's factory method support抽象出 Autofac 的工厂方法支持
【发布时间】:2012-11-13 20:03:06
【问题描述】:

抽象出 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的方法。

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

这就是我所期待的结果:

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

在使用容器时:

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

【问题讨论】:

    标签: c# inversion-of-control autofac


    【解决方案1】:

    我想以下方法会起作用:

    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,就像您的第一个示例一样。由于我不太确定您要在这里实现什么目标,因此我无法提出更好的替代方案。

    【讨论】:

    • 我只是在学习如何抽象出 autofac,这样我的项目就不必直接依赖它——它在另一个程序集中。
    • @DanielA.White:通常,您应该只在您的合成根目录中使用 DI 容器。这是您项目的一个非常受限的区域。切换 DI 容器只需要更改此约束区域。我不确定这是否值得努力。
    猜你喜欢
    • 2011-01-05
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多