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

时间:2018-10-19 22:14:49

标签: autofac

问题:如何在现有的Autofac生存期范围内使用Autofac Factory委托创建 new 实例?

根据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调用此Factory委托时,我都需要有一个新实例

将我的注册从InstancePerLifetimeScope切换到InstancePerDependency:

 builder.RegisterType<SlaInMinutes>().InstancePerDependency()
每次调用Factory方法时,

不具有创建新实例的作用。

我需要什么:

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 :(得分:0)

如果要为每个调用创建新实例,请从注册中删除InstancePerDependency / InstancePerDependency方法调用。

有关实例范围的更多详细信息,请参考链接https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html?highlight=InstancePerDependency