Autofac委托工厂 - 如何每次创建一个新实例?

5
问题:如何在现有的Autofac生命周期范围内使用Autofac工厂委托来创建一个新实例?
根据Autofac文档,
如果您将对象注册为InstancePerDependency()并多次调用委托工厂,则每次都会获得一个新实例。
但是,在将工厂注入到现有生命周期范围内的类的构造函数中时,情况并非如此。
一些额外的背景信息:我正在尝试使用 Autofac Delegate Factories来每次创建一个ValueObject类的新实例。
这个ValueObject类的构造函数和委托工厂看起来像这样:
public SlaInMinutes(int slaInMinutes, ISlaCalculator slaCalculator, ITicketUnitOfWork ticketUnitOfWork)
public delegate SlaInMinutes Factory(int slaInMinutes);

Autofac注册的样子如下:

builder.RegisterType<SlaInMinutes>().InstancePerLifetimeScope();

当我将Factory委托注入到现有LifetimeScope中的类构造函数(SlaInMinutes.Factory slaFactory)中时,我可以使用Factory参数实例化一个新类,并且Autofac会处理其余的构造函数依赖项。这很棒。
但是,自从我实例化它之后,每次都是相同的实例。我需要每次调用此工厂委托时,基于Factory参数int slaInMinutes获得一个新实例
将我的注册从InstancePerLifetimeScope更改为InstancePerDependency:
 builder.RegisterType<SlaInMinutes>().InstancePerDependency()

这个工厂方法每次调用时并没有创建一个新的实例。

我所需要的是:

slaFactory.Invoke(1) //new instance
slaFactory.Invoke(2) //new instance
slaFactory.Invoke(1) //same instance or new instance, don't care

这是一个ASP.NET Core 1.0的Web应用程序,Lifetime作用域在API端点调用开始时启动,并持续到该API调用完成。
1个回答

0

我已编辑原始帖子以指示原始注册为“InstancePerLifetimeScope”。从“InstancePerLifetimeScope”更改为“InstancePerDependency”(或完全删除注册)不会根据涉及构造函数参数每次都产生新实例。 - letsgetsilly
@letsgetsilly 为什么不移除这个方法调用?它并非必需的。 - Sham
我在描述中包含了InstancePerDependency()方法调用和InstancePerLifetimeScope()方法调用,以明确我的注册目的。我知道如果我不显式地声明InstancePerLifetimeScope()或InstancePerDependency(),Autofac会默认为InstancePerDependency。我试图解决的问题是在现有生命周期范围内(即在执行API方法期间调用的IContainer.BeginLifetimeScope())每次使用Autofac生成一个新实例的情况。 - letsgetsilly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接