当使用 Autofac IoC 容器时,我们可以定义组件实例的生命周期或范围。实例的范围决定了何时和如何依赖注入。在 Autofac 中,我们可以通过显式设置作用域或使用默认的作用域来设置组件的生命周期。
Autofac 中的五种实例范围:
- InstancePerDependency: 为每次依赖注入创建新的实例。
- InstancePerLifetimeScope: 为每个 LifetimeScope 创建只有单个实例的组件。
- InstancePerMatchingLifetimeScope: 为每个匹配的 LifetimeScope 创建只有单个实例的组件。(必须与 LifetimeScope 标记合作使用)
- InstancePerRequest: RequestContext 终止时创建一次实例。
- SingleInstance: 在容器生命周期内只创建一次实例。
当我们不显式设置组件的实例范围时,Autofac 的默认范围是 InstancePerDependency。即每次依赖注入时,都会在容器中创建一个新的实例。
下面我们来看两个示例:
- 使用 InstancePerLifetimeScope 来创建组件
class Demo
{
private readonly IFoo _foo;
private readonly IBar _bar;
public Demo(IFoo foo, IBar bar)
{
_foo = foo;
_bar = bar;
}
public void DoSomething() { ... }
}
containerBuilder.RegisterType<Foo>().As<IFoo>().InstancePerLifetimeScope();
containerBuilder.RegisterType<Bar>().As<IBar>().InstancePerLifetimeScope();
using (var scope = container.BeginLifetimeScope())
{
var demo = scope.Resolve<Demo>();
demo.DoSomething();
}
在这个示例中,我们将 IFoo 和 IBar 注册为 InstancePerLifetimeScope 的生命周期。当我们创建组件的 LifetimeScope 时,Foo 和 Bar 只会被实例化一次。然后我们可以使用 Resolve() 方法来获取 Demo 组件的一个实例,并调用 DoSomething() 方法。
- 使用 InstancePerRequest 来创建组件
如果您在 ASP.NET 中使用 Autofac,那么您选择的最佳作用域和生命周期将是 InstancePerRequest 生命周期。这样,每个 HTTP 请求都会创建一个 RequestLifetimeScope,以确保在请求期间创建的组件都能及时释放和清理。下面是一个使用 InstancePerRequest 来创建组件的示例:
public class DemoController : Controller
{
private readonly IFoo _foo;
public DemoController(IFoo foo)
{
_foo = foo;
}
public ActionResult Index()
{
...
}
}
containerBuilder.RegisterType<Foo>().As<IFoo>().InstancePerRequest();
//在 Global.asax.cs 中设置
protected void Application_BeginRequest(object sender, EventArgs e)
{
var context = new HttpContextWrapper(HttpContext.Current);
var lifetimeScope = container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag, builder =>
{
builder.Register(c => context).As<HttpContextBase>().InstancePerRequest();
});
LifetimeScopeProvider.SetLifetimeScope(lifetimeScope);
}
protected void Application_EndRequest(object sender, EventArgs e)
{
var lifetimeScope = LifetimeScopeProvider.GetLifetimeScope();
lifetimeScope?.Dispose();
}
在这个示例中,我们在 DemoController 中使用 IFoo,并将其注册为 InstancePerRequest 的生命周期。然后,我们在 Global.asax.cs 中使用 BeginLifetimeScope() 来为 ASP.NET 请求创建 LifetimeScope。自动释放生命周期作用域时,请确保在 DefaultModelBinder 或类似浅析工具不再需要它们时在 HttpContextBase 中设置它们以释放注入的组件。
这就是关于 Autofac 组件生命周期范围的简单介绍,您可以选择最适合您应用程序的范围进行组件注册。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:谈一谈autofac组件的实例范围 - Python技术站