2012-11-13 23 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容器將需要您僅更改此約束區域。我不確定這是否值得。 –