我是autofac的新手。我在新的Web api 2项目上使用它。以下是由Global.asax的Application_Start()方法调用的我的autofac配置代码。我不确定InstancePerRequest()的用法是否正确。更重要的是,它甚至根本不需要使用吗?或者,我应该使用其他选项,例如InstancePerLifeTimeScopre()或InstancePerDependency()?无论我是否使用这些生存期范围选项中的任何一个,在调试期间,它们都会产生相同的结果。
public class IocConfig
{
//Autofac configuration
public static void Configure()
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<DeliveryCode>().As<IDeliveryCode>()
.InstancePerRequest();
builder.RegisterType<DeliveryContext>().As<IDeliveryContext>()
.InstancePerRequest();
builder.RegisterType<DeliveryStrategy>().As<IDeliveryStrategy>()
.InstancePerRequest();
IContainer container = builder.Build();
AutofacWebApiDependencyResolver resolver = new
AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
}
}
答案 0 :(得分:0)
确定依赖项的生存期确实取决于应用程序的需求。例如,如果您有一个用于检索常量值的依赖项,则它可能最适合作为单例,以便在应用程序的整个生命周期中仅检索一次这些值。
如果您还没有的话,建议您查看“控制范围和生命周期”上的Autofac documentation。它很好地概述了实例范围的类型(即InstancePerLifeTimeScope()
或InstancePerDependency()
)之间的差异以及它们的行为方式。
答案 1 :(得分:0)
InstancePerDependency-为每个依赖项获取一个新对象。客户端之间永远不会共享对象。我会说仅在需要时才使用它,因为它比其他方法更慢并且使用更多的内存。但这很安全,因为每个依赖项都是一个私有对象。
InstancePerRequest-您为一个Web api调用获得一个新对象。当您要为每个api调用创建一个新对象,然后在此特定api调用期间在所有其他对象之间共享它时,这很有用。
InstancePerLifeTimeScope-这与以前的类似,但是更通用。您通常不需要此,只需忽略即可。 :-)
SingleInstance-这将在全局范围内创建一个实例,并在不同的Web API调用和所有内容之间共享。对于全球数据提供者很有用,无状态类为其他人提供“服务”等。
请注意,“每个依赖项”和“单个实例”彼此相反。而“每个请求”介于两者之间,是针对Web API量身定制的。 :-)
还请注意,如果您尝试了它们,但它们的表现似乎相同,则可能是因为您的测试是错误的。但这也可以是事实-无状态服务可以注册为任何类型,并且可以正常运行。如果在其他注册类型合适的情况下使用逐个依赖关系,则效率较低。同样,在单例适用的情况下,按请求使用效率较低。但这仅仅是优化。另一方面,如果您的类是有状态的,并且在您实际上需要单独的实例时错误地将其注册为单例,则您的程序将出现错误行为,这比没有充分优化的问题更大。