我是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;
}
}发布于 2019-01-22 07:17:26
InstancePerDependency -您可以为每个依赖项获取一个新对象。对象永远不会在客户端之间共享。我要说的是,只有在需要的时候才使用它,因为它比其他的更慢并且使用更多的内存。但它是非常安全的,因为每个依赖项都是一个私有对象。
InstancePerRequest -对于一个web调用,您将获得一个新对象。当您想要为每个api调用创建一个新对象,然后在此特定api调用期间在所有其他对象之间共享该对象时,这很有用。
InstancePerLifeTimeScope -这个类似于前面的,但更通用。你通常不需要这个,忽略它就行了。:-)
SingleInstance -这只会在全局范围内创建一个实例,在不同的web调用之间共享。对于全局数据提供者、向其他人提供“服务”的无状态类等非常有用。
请注意,“每个依赖项”和“单个实例”是相反的。"per request“是介于两者之间的东西,专为web api量身定做。:-)
另请注意,如果您尝试了它们,但它们的行为似乎是相同的,这可能是因为您的测试是错误的。但它也可以是真实的--无状态服务可以注册为任何类型,并将正常工作。如果您在其他注册类型合适的情况下使用每个依赖项,则效率会较低。同样,在适合使用单例的情况下,使用每个请求的效率也较低。但这一切都只是优化而已。另一方面,如果你的类是有状态的,当你实际上需要单独的实例时,你错误地将它注册为单例,你的程序将行为错误,这比不充分的优化更大的问题。
发布于 2019-01-22 06:44:58
确定依赖项的生命周期实际上取决于应用程序的需求。例如,如果您有一个用于检索常量值的依赖项,那么它可能最适合作为单例,以便在应用程序的整个生命周期中只检索这些值一次。
如果您还没有,我建议您查看“控制作用域和生命周期”的Autofac documentation。它很好地概述了实例作用域类型(即InstancePerLifeTimeScope()或InstancePerDependency())之间的差异以及它们的行为方式。
https://stackoverflow.com/questions/54298219
复制相似问题