Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽象出Autofac';s工厂方法支持_C#_Inversion Of Control_Autofac - Fatal编程技术网

C# 抽象出Autofac';s工厂方法支持

C# 抽象出Autofac';s工厂方法支持,c#,inversion-of-control,autofac,C#,Inversion Of Control,Autofac,提取Autofac工厂方法支持的正确方法是什么 我一直得到这样的例外: 此解析操作已结束。使用lambdas注册组件时, 无法存储lambda的IComponentContext“c”参数。相反,也不是 从“c”再次解析IComponentContext,或解析基于Func的工厂以创建 来自的后续组件 下面是我的总结 public void Register<T>(Func<IFactoryContext, T> factoryMethod) { _containe

提取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));
   });
}
在使用容器时:

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

我想以下方法可行:

public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
   _containerBuilder.Register<Func<Type, T>>(c =>
      request => {
          var ctx = c.Resolve<IComponentContext>();
          factoryMethod(new AutofacFactoryContext(ctx));
   });
}
公共无效寄存器(Func factoryMethod)
{
_containerBuilder.Register(c=>
请求=>{
var ctx=c.Resolve();
factoryMethod(新的AutoFactoryContext(ctx));
});
}

但是,请注意,这不会使用
请求
,就像您的第一个示例一样。因为我不确定您在这里想要实现什么,所以我无法提出更好的替代方案。

我只是在学习如何抽象出autofac,这样我的项目就不必直接依赖它-它在另一个程序集中。@DanielA.White:通常,您应该只在您的合成根目录中使用DI容器。这是您的项目的一个非常受限的领域。切换DI容器只需要更改此约束区域。我不确定这是否值得努力。
 var foobar = container.Resolve<IFoo>();
public void Register<T>(Func<IFactoryContext, T> factoryMethod)
{
   _containerBuilder.Register<Func<Type, T>>(c =>
      request => {
          var ctx = c.Resolve<IComponentContext>();
          factoryMethod(new AutofacFactoryContext(ctx));
   });
}