2012-11-13 25 views
0

抽象出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>(); 

回答

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,就像您的第一个示例一样。由于我不确定你想在这里做什么,我不能提出一个更好的选择。

+0

我只是在学习如何抽象出autofac,以便我的项目不必对它有直接的依赖关系 - 它在另一个程序集中。 –

+2

@ DanielA.White:通常情况下,您只能在您的作文根目录中使用DI容器。这是您项目的一个非常有限的领域。切换DI容器将需要您仅更改此约束区域。我不确定这是否值得。 –