将 lambda 注册为工厂(具有依赖项)

Register lambda as factory (with dependencies)

我正在尝试从 Grace IOC 容器迁移到 Autofac。

在Grace中,我可以做这样的注册(original source):

block.ExportFactory<SimpleObjectA, SimpleObjectB, SimpleObjectC, IEnumerable<ISimpleObject>>(
                    (a, b, c) => new List<ISimpleObject> { a, b, c });`

总之,它以一个 lambda 表达式作为工厂,其参数由容器解析并提供给它。

在 Autofac 中,我发现的是:

containerBuilder.Register((context, parameters) => new Service(...));

在 Autofac 中,由您来解决 lambda 中的依赖关系。您找到的注册是正确的。

假设您的 lambda 是 a => new Service(a),这就是工厂。我这么说是因为您展示的 Grace 示例会 automatically be handled by Autofac supporting IList<T>.

你会这样注册:

builder.Register(ctx =>
  {
    var a = ctx.Resolve<IDependency>();
    return new Service(a);
  });

如果你想use parameters,你可以。

builder.Register((ctx, p) =>
  {
    var a = p.Typed<IDependency>();
    return new Service(a);
  });

但是,您还可以做更多可能也有帮助的事情,为此我不会复制文档。可能您根本不需要注册 lambda,Autofac 会为您完成其中的一些工作。你会想看看...

这里有很多选项,这完全取决于您要实现的目标...老实说,问题并不是 100% 清楚。希望这会让您朝着正确的方向前进。