将 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 会为您完成其中的一些工作。你会想看看...
- Auto-generated factories that allow parameters like
Func<A, B>
- Delegate factories 您可以在其中提供一些输入作为参数和容器中的其他输入。
这里有很多选项,这完全取决于您要实现的目标...老实说,问题并不是 100% 清楚。希望这会让您朝着正确的方向前进。
我正在尝试从 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 会为您完成其中的一些工作。你会想看看...
- Auto-generated factories that allow parameters like
Func<A, B>
- Delegate factories 您可以在其中提供一些输入作为参数和容器中的其他输入。
这里有很多选项,这完全取决于您要实现的目标...老实说,问题并不是 100% 清楚。希望这会让您朝着正确的方向前进。